证明强可能素数的素数

时间:2011-01-20 20:26:40

标签: python algorithm primes

使用Miller-Rabin测试的概率版本,我生成了一个中大(200-300位)可能素数的列表。但可能还不够好!我需要知道这些数字是素数。是否有一个库 - 最好是在Python中包装或包装 - 实现了一种更有效的素性证明算法?

或者,是否有人知道我在哪里可以找到ECPP的清除详细完整描述(或类似的快速算法)那不承担大量的先验知识?

更新:我发现了Java implementation另一个测试,APRT-CLE,最终证明了素数。它在原子处理器上用不到10分钟的时间验证了291位数的候选人。仍然希望更快的东西,但这似乎是一个充满希望的开始。

2 个答案:

答案 0 :(得分:9)

作为提供可靠多项式素性测试的算法,请考虑AKS。有一个older SO article引用实现和算法演示。

答案 1 :(得分:6)

我发现Pari / GP库和语言使用APR-CL来证明素数,这实际上是这个大小范围内数字的首选算法,结果证明。 GP在原子处理器上在20秒内证明了一个291位的候选素数,这足以满足我的需要,它带有一个我可以使用ctypes访问的c库。

import ctypes

def pari_isprime(self, n):
    try: pari = ctypes.cdll.LoadLibrary("libpari.so")
    except OSError:
        print "pari_isprime: couldn't load libpari!"
        exit()
    int(n)
    pari.pari_init(4000000, 2)
    ret = bool(pari.isprime(pari.gp_read_str(str(n))))
    pari.pari_close()
    return ret

我也可以使用instant模块。这是一个简单的c函数,它通过pari的解析器运行一个字符串,并将结果作为字符串返回:

from instant import inline

runpari_code = """
PyObject* runpari(PyObject *args) {
    pari_init(40000000, 2);
    char *pari_code;
    char *outstr;

    if (!PyArg_Parse(args, "s", &pari_code)) { return NULL; } // instant uses old-style args; for a module, use PyArg_ParseTuple
    outstr = GENtostr(gp_read_str(pari_code));
    pari_close();
    return Py_BuildValue("s", outstr);
}
"""
runpari = inline(runpari_code, system_headers=['pari/pari.h'], libraries=['pari'])

以上内容也可以作为正确的CPython扩展的基础。