Эмпирический поиск кубов , у которых аликвотная сумма делителей является точным квадратом
Задачу нашел тут:
https://www.shyamsundergupta.com/canyoufind.htm#cyf63Я проверил, что для всех кубов в диапазоне до 10 в 20-й степени (около 4,6 млн) , является ли аликвотная сумма его делителей точным квадратом.
Проверил - не является.
Ничего не нашел.
У меня отработало за 20 минут.
Дальше мое железо отказывается работать.
Можно локально дальше попробовать пари, но там тоже сильно не разгонишься.
(Оффтоп)
Код:
use num_bigint::BigUint;
use num_traits::ToPrimitive;
use std::time::Instant;
const LIMIT: u128 = 10u128.pow(20); // 10^20
// ==========================================
// ФАКТОРИЗАЦИЯ (для u128)
// ==========================================
fn factorize(mut n: u128) -> Vec<(u128, u128)> {
let mut factors = Vec::new();
let mut d: u128 = 2;
while d * d <= n {
if n % d == 0 {
let mut exp = 0;
while n % d == 0 {
n /= d;
exp += 1;
}
factors.push((d, exp));
}
d += if d == 2 { 1 } else { 2 };
}
if n > 1 {
factors.push((n, 1));
}
factors
}
// ==========================================
// АЛИКВОТНАЯ СУММА (BigUint)
// ==========================================
fn aliquot_sum(n: u128) -> BigUint {
let factors = factorize(n);
let mut sigma = BigUint::from(1u64);
for &(p, a) in &factors {
let p_big = BigUint::from(p);
let mut power = BigUint::from(1u64);
for _ in 0..a {
power *= &p_big;
}
let numerator = &power * &p_big - BigUint::from(1u64);
let denominator = &p_big - BigUint::from(1u64);
sigma *= numerator / denominator;
}
sigma - BigUint::from(n)
}
// ==========================================
// ПРОВЕРКА КВАДРАТА (на лету, без памяти)
// ==========================================
fn is_square(n: u128) -> bool {
let r = (n as f64).sqrt() as u128;
r * r == n
}
// ==========================================
// ОСНОВНОЙ ПОИСК
// ==========================================
pub fn main_cyf() {
let start = Instant::now();
println!("🔍 Поиск до 10^20 (без памяти, на u128)");
let max_cbrt = (LIMIT as f64).cbrt() as u128;
let mut found = false;
for n in 2..=max_cbrt {
let cube = n * n * n;
let s = aliquot_sum(cube);
// Проверяем, является ли аликвотная сумма квадратом (на лету)
if let Some(val) = s.to_u128() {
if is_square(val) {
found = true;
let k = (val as f64).sqrt() as u128;
println!("🎯 Найдено! {}^3 = {} | Аликвотная сумма = {}", n, cube, s);
println!(" Аликвотная сумма является квадратом: {} = {}^2", val, k);
break;
}
}
if n % 100_000 == 0 {
let elapsed = start.elapsed();
println!("⏳ Статус: проверено {} кубов ({}%) за {:.2?}", n, (n as f64 / max_cbrt as f64) * 100.0, elapsed);
}
}
let elapsed = start.elapsed();
println!("\n✅ Поиск завершён за {:?}", elapsed);
if !found {
println!("❌ Ничего не найдено до 10^20.");
}
}
Код:
🏆 [РЕКОРД] n = 4 | куб = 64 | сумма = 63 | ближайший квадрат = 64 | разница = 1 |
...
🏆 [РЕКОРД] n = 51696 | куб = 138156340801536 | сумма = 277229659546224 | ближайший квадрат = 277229659546225 | разница = 1 |
🏆 [РЕКОРД] n = 65536 | куб = 281474976710656 | сумма = 281474976710655 | ближайший квадрат = 281474976710656 | разница = 1 |
...
🏆 [РЕКОРД] n = 705894 | куб = 351737337148656984 | сумма = 788152181388657216 | ближайший квадрат = 788152181388657316 | разница =
100
...
[РЕКОРД] n = 3269290 | куб = 34943012067863089000 | сумма = 48781448672354351000 | ближайший квадрат = 48781448672354345025 | разница = 5975
...