我需要遍历所有整数:
并查看每个对象是否具有某种属性(除了这三个属性之外)。然后,我需要使用此属性将所有此类整数求和。以下代码正是这样做的:
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
?