Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Miller-Rabin代码-can';你没有发现任何错误吗?_Python_Primes_Primality Test - Fatal编程技术网

Python Miller-Rabin代码-can';你没有发现任何错误吗?

Python Miller-Rabin代码-can';你没有发现任何错误吗?,python,primes,primality-test,Python,Primes,Primality Test,我使用了一些来自罗塞塔代码的代码。我重新命名了一些东西,但我没有真正改变任何东西 import random def is_probable_prime(n, num_trials = 5): assert n >= 2 if n == 2: return True if n % 2 == 0: return False s = 0 d = n-1 while True: quotient,

我使用了一些来自罗塞塔代码的代码。我重新命名了一些东西,但我没有真正改变任何东西

import random

def is_probable_prime(n, num_trials = 5):
    assert n >= 2
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    s = 0
    d = n-1
    while True:
        quotient, remainder = divmod(d, 2)
        if remainder == 1:
            break
        s += 1
        d = quotient
    assert(2**s * d == n-1)

    def try_composite(a):
        if pow(a, d, n) == 1:
            return False
        for i in range(s):
            if pow(a, 2**i * d, n) == n-1:
                return False
            return True

    for i in range(num_trials):
        a = random.randrange(2, n)
        if try_composite(a):
            return False
    return True
它与一些伪代码非常接近。但是,当我测试数字时

12345678900123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901


它返回
False
。Miller-Rabin的其他(python和java)实现为可能的素数返回
True
。经过一些测试,
try\u composite
仅在
2轮后返回
True
!我真的很想知道任何错误,我猜是缩进错误或一些我不知道的功能。

在您的
try\u composite
函数中,
for
循环应该是
for I在范围(1,s)
。不要测试
i
为零的情况

编辑:此外,您的
try\u composite
函数中缺少一个测试。以下是我的伪代码版本:

def isPrime(n, k=5):
    def isComposite(s, d):
        x = pow(randrange(2,n-1), d, n)
        if x == 1 or x == n-1: return False
        for r in range(1, s):
            x = pow(x, 2, n)
            if x == 1: return True
            if x == n-1: return False
        return True
    if n < 2: return False
    for p in [2, 3, 5, 7, 11, 13, 17]:
        if n % p == 0: return n == p
    s, d = 0, n-1
    while d % 2 == 0: s, d = s+1, d/2
    for i in range(k):
        if isComposite(s, d): return False
    return True

注意控制流指向下一个i
的两个位置。没有好的方法用Python编写。一个选项使用一个额外的布尔变量,可以设置和测试该变量,以确定何时绕过其余代码。另一个选择是编写一个本地函数来执行任务,我在上面已经做过。这种“循环半”的习惯用法既方便又有用;它是在和由Guido提出的。

您好,要求我们调试某人代码的问题通常在此结束。你为什么不自己调试一下呢?你调试过程序吗?@sashoalm我调试过。我看到代码的第一部分,我相信它能像预期的那样工作——s it 1,d是n/2。当数字被传递到try_composite时,如果语句被触发,我看不出为什么,因为它应该工作。我重复一遍,这个站点不打算提供调试帮助,那么为什么您要尝试在那里推动对话?调试一下,伙计。花点时间做你的工作。请看--这是python调试器。不幸的是,这不适用于
1234567890123
-您认为如何?
function isPrime(n, k=5)
    if n < 2 then return False
    for p in [2,3,5,7,11,13,17,19,23,29]
        if n % p == 0 then return n == p
    s, d = 0, n-1
    while d % 2 == 0
        s, d = s+1, d/2
    for i from 0 to k
        x = powerMod(randint(2, n-1), d, n)
        if x == 1 or x == n-1 then next i
        for r from 1 to s
            x = (x * x) % n
            if x == 1 then return False
            if x == n-1 then next i
        return False
    return True