我试图获得64位整数(大于32位)的除数数
我的第一种方法(对于小数字)是将数字除以得到的数字为1,计算匹配的素数并使用公式(1 + P1)(1+ P2) .. *(1 + Pn)=除数数
例如:
24 = 2 * 2 * 2 * 3 = 2 ^ 3 * 3 ^ 1
==> ( 3 + 1)*( 1 + 1)= 4 * 2 = 8个除数
public static long[] GetPrimeFactor(long number)
{
bool Found = false;
long i = 2;
List<long> Primes = new List<long>();
while (number > 1)
{
if (number % i == 0)
{
number /= i;
Primes.Add(i);
i = 1;
}
i++;
}
return Primes.ToArray();
}
但是对于大整数,这种方法需要进行多次迭代。我找到了一个名为Quadratic sieve的方法来使用平方数进行分解。现在使用我的脚本可以更容易,因为数字要小得多。
我的问题是,如何实施此二次筛选?
答案 0 :(得分:2)
四象筛是一种寻找大数量大因素的方法;想想10 ^ 75,而不是2 ^ 64。即使在简单的伪代码形式中,二次筛也很复杂,如果你想要它有效,则更加复杂。它对于64位整数来说非常难以理解,并且比专门用于这种小数字的其他方法要慢。
如果试验分裂对你来说太慢,那么复杂性的下一步就是John Pollard的rho方法;对于64位整数,你可能想要试用除以一些小的限制,也许是不到一千的素数,然后切换到rho。这是一个简单的伪代码,可以找到单个因子 n ;在复合辅助因子上反复调用它来完成分解:
function factor(n, c=1)
if n % 2 == 0 return 2
h := 1; t := 1
repeat
h := (h*h+c) % n
h := (h*h+c) % n
t := (t*t+c) % n
g := gcd(t-h, n)
while g == 1
if g is prime return g
return factor(g, c+1)
还有其他方法可以计算64位整数,但这可以帮助您入门,并且可能足以满足大多数用途;你可以搜索理查德布伦特的rho算法的变种,以获得适度的加速。如果你想了解更多,我谦虚地在我的博客上推荐论文Programming with Prime Numbers。