Итерирование по всем квадратным композициям <L - PullRequest
2 голосов
/ 03 мая 2019

Мне нужно перебрать все целые числа, которые:

  1. Композитный
  2. безквадратный
  3. Меньше, чем предел 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 с сублинейной временной сложностью?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...