【问题标题】:Finding number of divisors of a big integer using prime/quadratic factorization (C#)使用素数/二次因式分解 (C#) 查找大整数的除数数
【发布时间】:2015-03-22 13:31:23
【问题描述】:

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

我的问题是,我该如何实现这个二次筛?

【问题讨论】:

  • 你要写一个大程序,所以你的问题太宽泛了。
  • 我的问题是二次筛的伪代码,这不是一个大程序吗?

标签: primes quadratic factorization sieve


【解决方案1】:

二次筛是一种寻找大数的大因数的方法;想想 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 位整数,但这可以帮助您入门,并且可能足以满足大多数目的;您可以搜索 Richard Brent 的 rho 算法变体以获得适度的加速。如果你想了解更多,我在我的博客中谦虚地推荐这篇文章Programming with Prime Numbers

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2014-01-28
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多