Мне нужно перебрать все целые числа, которые:
- Композитный
- безквадратный
- Меньше, чем предел L
И посмотрите для каждого, имеет ли оно определенное свойство (в дополнение к этим 3). Затем мне нужно сложить все такие целые числа с этим свойством. Следующий код делает именно это:
public static void main(String[] args)
{
long L=(long) Math.pow(10,12);
long [] primes = eratosthenes(L/2);
long sigma=0;
for (int i=0;i<primes.length-1;i++)
sigma+=squareFreeCompositesGenerator(L,primes[i],i+1,primes);
System.out.println(sigma);
}
public static long squareFreeCompositesGenerator(long L, long prod, int position, long [] primes)
{
long sum=0;
for (int i=position;i<primes.length&&prod*primes[i]<=L;i++)
{
if (property(prod*primes[i]))
sum+=prod*primes[i];
sum+=squareFreeCompositesGenerator(limit,prod*primes[i],i+1,primes);
}
return sum;
}
Идея, стоящая за этим, состоит в том, что вместо проверки всех чисел до L
, если они не содержат квадратов, я могу просто создать их, что значительно быстрее. В этом коде вызов для eratosthenes(n)
возвращает сито всех простых чисел до n
. Затем метод squareFreeCompositesGenerator «создает» все квадратные композиты, размер которых меньше L
, и проверяет, имеют ли они свойство с помощью метода property
. Через рекурсию он продолжает умножать простые числа без повторений и проходит через все возможные комбинации. Ахиллесова пята этого алгоритма, тем не менее, находится в самом начале, где мне требуются все простые числа p⩽L/2
. Это связано с тем, что наибольшее возможное такое целое число может иметь вид 2⋅p
, где p
- наибольшее простое число до L/2
. Программа работает быстро даже для L=10^9
, но для L
размером с 10^12
я не могу создать и сохранить все эти простые числа в разумные сроки.
Важно отметить, что мне не нужно суммировать все квадратичные композиты < L
или считать их количество, а просто перебирать все из них и проверять, имеют ли они определенное свойство.
Есть ли способ настроить код так, чтобы он требовал только простых чисел до √n (n^1/2)
? Возможно, существует другой подход для итерации по всем квадратно-свободным композитам < L
с сублинейной временной сложностью?