使用素数/二次分解(C#)查找大整数的除数数

时间:2015-03-22 13:31:24

标签: primes quadratic factorization sieve

我试图获得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的方法来使用平方数进行分解。现在使用我的脚本可以更容易,因为数字要小得多。

我的问题是,如何实施此二次筛选?

1 个答案:

答案 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