- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经实现了 Miller-Rabin 素数测试,并且每个函数似乎都可以单独正常工作。但是,当我尝试通过生成 70 位随机数来找到素数时,我的程序在找到通过 Miller-Rabin 测试(10 步)的数字之前平均生成超过 100000 个数字。这很奇怪,对于一个小于 70 位的随机奇数,它是质数的概率应该非常高(根据 Hadamard-de la Vallée Poussin 定理,大于 1/50)。我的代码可能有什么问题?随机数生成器是否有可能以非常低的概率抛出质数?我想不是...非常欢迎任何帮助。
import random
def miller_rabin_rounds(n, t):
'''Runs miller-rabin primallity test t times for n'''
# First find the values r and s such that 2^s * r = n - 1
r = (n - 1) / 2
s = 1
while r % 2 == 0:
s += 1
r /= 2
# Run the test t times
for i in range(t):
a = random.randint(2, n - 1)
y = power_remainder(a, r, n)
if y != 1 and y != n - 1:
# check there is no j for which (a^r)^(2^j) = -1 (mod n)
j = 0
while j < s - 1 and y != n - 1:
y = (y * y) % n
if y == 1:
return False
j += 1
if y != n - 1:
return False
return True
def power_remainder(a, k, n):
'''Computes (a^k) mod n efficiently by decomposing k into binary'''
r = 1
while k > 0:
if k % 2 != 0:
r = (r * a) % n
a = (a * a) % n
k //= 2
return r
def random_odd(n):
'''Generates a random odd number of max n bits'''
a = random.getrandbits(n)
if a % 2 == 0:
a -= 1
return a
if __name__ == '__main__':
t = 10 # Number of Miller-Rabin tests per number
bits = 70 # Number of bits of the random number
a = random_odd(bits)
count = 0
while not miller_rabin_rounds(a, t):
count += 1
if count % 10000 == 0:
print(count)
a = random_odd(bits)
print(a)
最佳答案
这在 python 2 而不是 python 3 中起作用的原因是两者处理整数除法的方式不同。在 python 2 中,3/2 = 1
,而在 python 3 中,3/2=1.5
。
看起来你应该在 python 3 中强制整数除法(而不是 float 除法)。如果您更改代码以强制进行整数除法 (//
):
# First find the values r and s such that 2^s * r = n - 1
r = (n - 1) // 2
s = 1
while r % 2 == 0:
s += 1
r //= 2
无论您使用什么 python 版本,您都应该看到正确的行为。
关于python - 找到素数的概率(使用 miller-rabin 检验),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37007539/
我正在尝试实现 Rabin Karp 算法的一些修改版本。我的想法是,如果我根据与每个字母相关的权重得到给定模式的哈希值,那么我就不必担心字谜,这样我就可以只选择字符串的一部分,计算它的哈希值并进行比
在 rabin 算法中取模如何帮助降低本地 horners 规则字符串匹配的复杂性。请任何人解释 最佳答案 我猜按照 Horners 规则,你的意思是将字符串视为某个基数中的数字 ("abcd"= '
我一直在尝试理解算法类的 Rabin-Karp 算法。我在理解它时遇到了很多麻烦,所以我尝试实现它(我实际上不必实现它)。我想我正确地理解了滚动哈希函数以外的所有内容。我的算法目前只适用于模式 cha
我有一个关于选择 q 和 d 的问题 in Rabin-Karp algorithm用于搜索字符串。该算法使用值 q 作为模数,使用 d 作为哈希函数。 如果我选择 q 作为 2 的幂并且 d=q-1
我在网站的论坛上看到过这个 Rabin Karp 字符串匹配算法,我有兴趣尝试实现它,但我想知道是否有人能告诉我为什么变量 ulong Q 和 ulong D 是 100007 和 256分别:S?这
我实现 Rabin-Karp 算法只是为了好玩。我遇到了这个伪代码: RABIN -KARP -MATCHER (T, P, d, q) 1 n = T.length 2 m
我正在实现 Wikipedia's Miller-Rabin algorithm但似乎没有得到甚至模糊恰当的结果。 7, 11, 19, 23 等被报道为复合 Material 。事实上,当 k>12
我从这个网站理解了 Rabin-Karp 算法:https://www.geeksforgeeks.org/rabin-karp-algorithm-for-pattern-searching/ 他们
我很清楚单个 Miller-Rabin 测试以三次对数时间运行。我知道蒙哥马利模幂和 GNFS 并且我不会问任何那些奇特的理论。我想知道的是,在特征硬件(例如,2.2 GHz Opteron 或某某显
我正在尝试制作 RSA 算法。为此,我需要 rabin-miller+witness+modular exponentiation(至少我需要使用它)。当我生成随机数以检查 rabin miller
在 Coursera 视频之一中,Rabin-Karp 滚动哈希 (http://en.wikipedia.org/wiki/Rolling_hash) 显示为: public static long
我的 previous question属于通用字符串搜索算法。我正在研究 Rabin-Karp 算法,我有一个函数模板,例如: RabinKarpMatch(char *Text, char *Se
我有 Miller-Rabin 实现 def MillerRabin(n,a): e = 0 q = n-1 while q % 2 == 0: e +=
我在实现 Karp-Rabin 的简单版本时遇到问题模式行进者;我没有得到预期的结果。这是我的例子; string='today is a good day' sub='good' 我想在上面的字符串
我正在阅读 Cormen 等人的《算法导论》中有关字符串算法的内容 以下是关于一些初等数论符号的文本。 注意:在下文中将 == 称为模等价。 给定一个整数除以另一个整数的余数的定义明确的概念,提供特殊
rolling hash Rabin-Karp算法中hashcode值过大如何处理?我使用模运算来避免负数,但是当哈希码超过我的模数(N = 83559671)时会出现问题。我将我的基数设置为素数(计
我正在为 Rabin-Karp 算法寻找高效的哈希函数。这是我的实际代码(C 编程语言)。 static bool f2(char const *const s1, size_t const n1,
我一直在使用 C++ 编写 Rabin-Karp 字符串匹配函数,但没有得到任何结果。我感觉我没有正确计算某些值,但我不知道是哪一个。 原型(prototype) void rabinKarp(str
我有兴趣实现 Rabin-Karp 算法来搜索 wiki 上所述的子字符串:http://en.wikipedia.org/wiki/Rabin-Karp_string_search_algorith
我希望使用滚动哈希函数,这样我就可以对非常大的字符串的 n-gram 进行哈希处理。 例如: “stackoverflow”,分成 5 克将是: "stack", "tacko", "ackov",
我是一名优秀的程序员,十分优秀!