Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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 数值误差_Python_Primes_Precision - Fatal编程技术网

Python 数值误差

Python 数值误差,python,primes,precision,Python,Primes,Precision,我写了一个快速筛选来测试一个数字是否为素数。我有两个问题: 1) 我测试了一个200位数的素数,它错误地说它不是素数。我相信这是由于浮点错误(或类似的错误)。我怎样才能使这更准确 2) 有没有更好的写作方法?我用十进制来处理较大的数字。这是最好的方式吗 import math from decimal import * def isprime(n): i = 2 a = 1 if n == 1: return 0 if n == 2 or n ==

我写了一个快速筛选来测试一个数字是否为素数。我有两个问题:

1) 我测试了一个200位数的素数,它错误地说它不是素数。我相信这是由于浮点错误(或类似的错误)。我怎样才能使这更准确

2) 有没有更好的写作方法?我用十进制来处理较大的数字。这是最好的方式吗

import math
from decimal import *
def isprime(n):
    i = 2
    a = 1
    if n == 1:
        return 0
    if n == 2 or n == 3:
        return 1
    while i < n**0.5 + 1:
        if Decimal(math.fmod(n,i)) == 0:
            a = 0
            i = n
        if Decimal(math.fmod(n,i)) != 0:
            i += 1
            a = 1
    return a
导入数学
从十进制输入*
def iPrime(n):
i=2
a=1
如果n==1:
返回0
如果n==2或n==3:
返回1
而i
标准浮点格式只能表示精确到2^53的整数(9007199254740992,16位);从这一点开始,可表示的整数之间就存在差距,这些差距随着数字的增大而增大

python的64位版本本机使用64位整数,在其他平台上可以使用的是's
int64
。这并不能让你接近200位数字,但它让你远离32位整数范围,让幼稚的代码变得非常缓慢

例如,试验除法需要只考虑到PI(Sqt(2 ^ 32))=6542个潜在的小素数除数,当使用整数达到2 ^ 32,或Sqt(2 ^ 32)/ 2=32767奇数候选除数加上2个数,或在使用这两个极端之间的某个位置时,使用高于2的阶数的轮。在2^64附近,要测试的小素因子的数量是pi(sqrt(2^64))=203280221

超过2^32的确定性素性测试是像or这样的算法的领域。米勒·拉宾(Miller Rabin)与某些精心挑选的碱基组合使用时,在某些阈值下具有确定性——大约在2^64左右;看见Baillie PSW也被认为具有至少2^64的确定性


这意味着,超过2^64,你需要使用某种大整数类型,你必须使用概率算法进行素性测试(给你“工业级”素数,而不是经过验证的素数)。或者计划花费大量的时间来证明一个200位数的素数。。。一个200位数的数字有一个100位数的平方根(大约300位),因此即使计算所有可能的小素数因子来支持一个简单的试除法测试也不再可行。

这是一个已经得到回答的重复问题。python有任意精度的整数,不需要用浮点数进行试除法,但试除法的速度要慢到大数字,最好检查其他更专业的算法,像这样的不是重复的;事实上没有重叠,因为这里的两个主要重点是中英文到大数字的数字精度和素性测试问题,而——以及大量类似的主题——只处理适合机器字的微不足道的小数字;许多人无法理解其中的区别。第二:浮点不准确肯定是问题的原因,因为您的算法是正确的。第三:一个200位数的数字太大了,不能用这种方法来测试它的素性。第四:你需要一个米勒·拉宾或贝利·瓦格斯塔夫素性测试仪;如果您需要代码,请告诉我。Python3具有无限精度整数数学,您应该使用它而不是
Decimal