Miller Rabin大素数生成代码依赖包(质因数分解等)获取求助
问题:无法找到并安装自定义依赖包「质因数分解」和「求大整数模幂运算」
我在YouTube上学习相关内容时,使用GitHub开发者提供的大素数生成代码遇到了问题:代码中引入的「质因数分解」(别名ku)和「求大整数模幂运算」(别名ku1)这两个依赖包无法找到并安装。代码如下:
import random import 质因数分解 as ku import 求大整数模幂运算 as ku1 def isPrime(testNum): smallPrime = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997} if testNum < 2: return False if testNum in smallPrime: return True for prime in smallPrime: if testNum % prime == 0: # print("被小素数整除了") return False return Miller_Rabin(testNum) def Miller_Rabin(testNum): safeTime = 50 # 素性检测次数 eulerN = testNum - 1 testNum2 = 0 # 计算n-1=2^s*t while eulerN % 2 == 0: testNum2 = testNum2 + 1 eulerN = eulerN // 2 # 计算n-1=2^s*t oddQ = eulerN # 得到t for trials in range(safeTime): random_a = random.randrange(2, testNum - 1) firstTest = pow(random_a, oddQ, testNum) if firstTest == 1 or firstTest == testNum - 1: continue else: nextTest = firstTest for i in range(1, testNum2): nextTest = (nextTest ** 2) % testNum if nextTest == testNum - 1: break # print("在第%d次素性测试中失败了" % (trials+1)) return False return True if __name__ == "__main__": ''' a = 202002723003 list = [] prime_m = 0 prime_b = 0 prime_a = 0 p = 1000000000000000000000000000000387 for i in range(a-20, a+1): # (a, a + 1000000) f = ku.factorize(p-1, verbose=True) print(ku.print_factorization(i, f)) for j in range(len(f)): b = f[j][0] print("%d ^ %d (mod %d) is %d "%(i, b, p, ku1.bigmod(p,b,i))) print("%d ^ %d (mod %d) is %d "%(i, p-1, p, ku1.bigmod(p,p-1 ,i))) # print("%d不是素数"%n)i for i in range(0, len(list), 3): try: prime_b = list[i] prime_m = list[i+1] prime_a = list[i+2] except: print('end') if prime_m > (prime_a+prime_b)//2: print('i:', prime_m) break ''' flag1 = False for i in range(1000000000000000000, 9000000000000000000): f = ku.factorize(i, verbose=True) if len(ku.print_factorization(i, f))==len(str(i))+2 and ku1.bigmod(8192,1,i)==1: if flag1: print(i) break else: flag1 = True print(i)
恳请告知这两个依赖包的获取渠道,谢谢!
解决方案
这两个「依赖包」并非公开PyPI上的标准库,而是原GitHub开发者自行编写的自定义Python模块:
- 「质因数分解」对应文件名为
质因数分解.py,需包含factorize()和print_factorization()两个函数,你需要从原代码所在的GitHub仓库中找到这个文件,放到当前运行代码的同一目录下。 - 「求大整数模幂运算」对应文件名为
求大整数模幂运算.py,需包含bigmod()函数,同样要从原仓库获取该文件,放到代码同目录。
- 「质因数分解」对应文件名为
如果找不到原仓库的对应模块,可以用以下替代方案:
- 模幂运算替代:Python内置的
pow(base, exp, mod)函数已经支持高效的大整数模幂运算,完全可以替代自定义的ku1.bigmod()。比如代码中的ku1.bigmod(8192,1,i)可以直接改成pow(8192, 1, i)(实际等价于8192 % i)。 - 质因数分解替代:使用第三方库
sympy的factorint()函数实现质因数分解:- 先安装sympy:
pip install sympy - 修改代码中的导入和调用:
# 替换原导入语句 from sympy import factorint # 替换ku.factorize(i, verbose=True) f = factorint(i) # 自定义打印质因数分解的逻辑(替代ku.print_factorization) def print_factorization(n, factors): parts = [f"{p}^{e}" if e > 1 else f"{p}" for p, e in factors.items()] return f"{n} = {' * '.join(parts)}"
- 先安装sympy:
- 模幂运算替代:Python内置的
内容的提问来源于stack exchange,提问作者Anmar Ali
相关产品推荐
相关产品推荐

