linux中factor命令背后的算法是什么?

linux中factor命令背后的算法是什么?,linux,algorithm,command,Linux,Algorithm,Command,factor命令打印指定整数的素数。 当我尝试的时候 factor 12345678912345678912 即使是如此庞大的数字,也会在工厂内产生影响 它使用的是哪种算法?以下是一个GNU因子源版本的示例: 它包括审判组和波拉德的rho的例行程序。在快速扫描中,我觉得它似乎使用了试算法来寻找一些小因素(最多约为lg(n)^2,在本例中约为4000),然后Pollard,如果剩下的可能不是prime。在这种情况下,如果我对4000的看法是正确的,那就是205432623008947,即351

factor命令打印指定整数的素数。

当我尝试的时候

factor 12345678912345678912
即使是如此庞大的数字,也会在工厂内产生影响


它使用的是哪种算法?

以下是一个GNU因子源版本的示例:

它包括审判组和波拉德的rho的例行程序。在快速扫描中,我觉得它似乎使用了试算法来寻找一些小因素(最多约为
lg(n)^2
,在本例中约为4000),然后Pollard,如果剩下的可能不是prime。在这种情况下,如果我对4000的看法是正确的,那就是
205432623008947
,即
35129*5847949643


在您的示例中,第二大素数因子是
35129
,最大素数因子的平方根约为
76471
。因此,单是审判司就很快,因为它只需要审判大约2.5万名候选人。

Gnu coreutils手册通知正在使用的候选人

来自:

算法:

  • 使用一个小的素数表执行试除法,但不使用硬件 由于素数表存储的除法与词基的模相反。 (此代码的GMP变体不使用预计算的 相反,而是依赖GMP进行快速可分性测试。)
  • 使用Miller-Rabin检查任何未考虑因素的零件的性质 检测复合物,Lucas检测素数
  • 使用Pollard Brent rho计算任何剩余复合材料零件的系数 算法,或者如果USE_SQUFOF定义为1,则首先尝试该方法。 使用Miller Rabin和Lucas再次检查已发现因素的状态
  • 我们更喜欢在部门中使用亨塞尔标准,而不是更熟悉的标准 欧几里德标准,因为前者导致更快的代码。在 Pollard Brent rho代码和prime测试代码,我们使用Montgomery的 将所有n-残基乘以词基的技巧,允许使用廉价的Hensel 约化

    GMP代码使用的算法可能要慢得多; 例如,在2017年前后的Intel Xeon Silver 4116上,保理 2^{127}-3使用双字算法大约需要50毫秒,但是 使用GMP代码大约需要750毫秒

    一般来说,
    因子
    的速度非常快。然而,这不是魔法;如果你选择病理学上难以分解的数字,它会显著减慢

    的潜在安全性是基于分解2个大的协素数的困难。那么,让我们看看我们可以如何努力推动大共模的
    因子。能够进行因式分解的最大数
    factor
    是2127-1(可能在内部用int64_t表示),它恰好是素数:

    $ factor $(bc <<< 2^127)
    factor: ‘170141183460469231731687303715884105728’ is too large
    $ factor $(bc <<< 2^127-1)
    170141183460469231731687303715884105727: 170141183460469231731687303715884105727
    $ factor $(bc <<< 2^127-2)
    170141183460469231731687303715884105726: 2 3 3 3 7 7 19 43 73 127 337 5419 92737 649657 77158673929
    $ 
    
    $factor$(bc)
    
    $ primes $(bc <<< 2^60) | head -2
    1152921504606847009
    1152921504606847067
    $ bc <<< 1152921504606847009*1152921504606847067
    1329227995784916015866073631529372603
    $ time factor 1329227995784916015866073631529372603
    1329227995784916015866073631529372603: 1152921504606847009 1152921504606847067
    
    real    0m30.628s
    user    0m30.578s
    sys 0m0.004s
    $