【Python】对大数质因数分解的算法问题
【Python】对大数质因数分解的算法问题
- 发现问题
- 尝试分析
- 最后
- 我的代码(C1)
- 百科代码(C2)
发现问题
我是一个初学者,在编写一个分解质因数的代码时,学习到了 Miller-Rabin素数测试算法 和 Pollard-Rho算法 这两个算法。试着编写了一段代码(下称C1),运行后效果还不错,但感觉好像哪里不对或者还可以优化,于是在网上搜索。最后在百度百科上看到了一段代码(下称C2),同样使用了上述两个算法。
运行C2后发现,大多数情况下,运行速度差不多。但发现一个数字a,C2的运行时间比C1慢很多。难道我写的算法更优?
数字a为11段1/7的循环节:142857142857142857142857142857142857142857142857142857142857142857
尝试分析
之后的尝试中,又发现1个数字b,会使得C1陷入死循环。分步解析后得出结论是,卡在了 find(n) 函数上。然后发现最可笑的是输入4无法得出因子2。那应该是我的算法错了吧?
再去理解了一遍 Pollard-Rho算法 ,发现是因为我定义的 find(n) 函数中使用随机函数 f(x)=x^2+a 无法解出因子2,既然如此,加上一个判定即可解决。
数字b为11段(1/7的循环节+111111):253968253968253968253968253968253968253968253968253968253968253968
最后
修复后尝试了一些大数,发现C1确实比C2要快。但我还是不敢确定C1的算法是否正确,还望有人可以指正。
最后尝试一下数字c,算了好久还以为又死循环了,最后C1都运行了2次了C2还没出结果,无奈ctrl+c。看来对于这种大因子的合数分解,这个算法似乎并不好用。
数字c为费马数2^128+1:340282366920938463463374607431768211457
我的代码(C1)
import math
import random
import time
start = time.perf_counter()# 判断输入是否为素数
def prime(n):if n in {2, 3, 5, 7, 11}:return Trueif n % 2 == 0 or n % 3 == 0 or n % 5 == 0 or n % 7 == 0 or n % 11 == 0:return Falset = 0u = n - 1while u % 2 == 0:t += 1u //= 2a = random.randint(2, n - 1)r = pow(a, u, n)if r != 1:while t > 1 and r != n - 1:r = (r * r) % nt -= 1if r != n - 1:return Falsereturn True# 寻找输入的一个因数
def find(n, a):def f(x):return (x * x + a) % n# 补上因子为2的判定if n % 2 == 0:return 2x1 = random.randint(0, n)x2 = x1while True:x1 = f(x1)x2 = f(f(x2))p = math.gcd(abs(x2-x1), n)if p > 1:return pif x1 == x2:return nnum = int(input('Positive integer:'))
print(f'{num}=')prime_list = []while num != 1:if prime(num):prime_list.append(num)breakelse:c = find(num, random.randint(0, num-1))if prime(c):prime_list.append(c)num //= cprime_list.sort()
print('*'.join(map(str, prime_list)))end = time.process_time()
print(f'Running time: {end - start} Seconds')
百科代码(C2)
摘自百度百科分解质因数,我加入了统计运行时间和输出显示。
import random
import time
start = time.perf_counter()def gcd(a, b):if a == 0:return bif a < 0:return gcd(-a, b)while b > 0:c = a % ba, b = b, creturn adef mod_mul(a, b, n):result = 0while b > 0:if (b & 1) > 0:result = (result + a) % na = (a + a) % nb = (b >> 1)return resultdef mod_exp(a, b, n):result = 1while b > 0:if (b & 1) > 0:result = mod_mul(result, a, n)a = mod_mul(a, a, n)b = (b >> 1)return resultdef MillerRabinPrimeCheck(n):if n in {2, 3, 5, 7, 11}:return Trueelif n == 1 or n % 2 == 0 or n % 3 == 0 or n % 5 == 0 or n % 7 == 0 or n % 11 == 0:return Falsek, u = 0, n - 1while not (u & 1) > 0:k += 1u = (u >> 1)random.seed(0)s = 5for i in range(s):x = random.randint(2, n - 1)if x % n == 0:continuex = mod_exp(x, u, n)pre = xfor j in range(k):x = mod_mul(x, x, n)if x == 1 and pre != 1 and pre != n - 1:return Falsepre = xif x != 1:return Falsereturn Truedef Pollard_rho(x, c):(i, k) = (1, 2)x0 = random.randint(0, x)y = x0while 1:i += 1x0 = (mod_mul(x0, x0, x) + c) % xd = gcd(y - x0, x)if d != 1 and d != x:return dif y == x0:return xif i == k:y = x0k += kdef PrimeFactorsListGenerator(n):result = []if n <= 1:return Noneif MillerRabinPrimeCheck(n):return [n]p = nwhile p >= n:p = Pollard_rho(p, random.randint(1, n - 1))result.extend(PrimeFactorsListGenerator(p))result.extend(PrimeFactorsListGenerator(n // p))return resultlis = PrimeFactorsListGenerator(int(input('n:')))
print('*'.join(map(str, lis)))end = time.process_time()
print(f'Running time: {end - start} Seconds')
【Python】对大数质因数分解的算法问题相关推荐
- 室温固态量子计算机,我国学者在室温固态体系中实现基于单自旋体系的质因数分解量子算法...
贤集网电子信息频道讯:从中国科学技术大学获悉,该校杜江峰院士课题组利用金刚石中的自旋作为量子处理器,近期在室温大气条件下实现了基于固态单自旋体系的质因数分解量子算法,向建造室温固态量子计算机迈进了重要 ...
- upc组队赛16 GCDLCM 【Pollard_Rho大数质因数分解】
GCDLCM 题目链接 题目描述 In FZU ACM team, BroterJ and Silchen are good friends, and they often play some int ...
- Python 利用栈质因数分解
需求 设计一个算法,利用栈实现质因数分解 例如 输入 300 输出 55322 思路 栈是大家熟知的数据结构,首先为了创建栈,需要利用python中的class: class Stack: #初始化d ...
- Pollard_rho大数质因数分解+拉格朗日四平方和定理(bzoj 2904: 平方和)
2904: 平方和 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 160 Solved: 73 [Submit][Status][Discuss] ...
- 质因数分解及算法实现
每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.如果一个质数是某个数的因数,那么就说这个质数是这个数的质因数.而这个因数一定是一个质数. 定义 质因数(或质因子)在数论里是指 ...
- Python 大数的质因数分解
肝了一天总算把大数质因数分解搞定了,这篇文章主要涉及了 Pollard rho 算法和试除法 我用了若干个质数的平方来对比这两个算法的性能,发现: 7e5 以上的数用 Pollard rho 算法更快 ...
- scp量子计算机,室温固态体系中实验实现绝热量子质因数分解
中国科学技术大学杜江峰课题组利用金刚石中的自旋作为量子处理器,首次在室温大气条件下实现了基于固态单自旋体系的质因数分解量子算法.研究成果发表在3月31日的<物理评论快报>上[Phys. R ...
- 输出递归因数分解php,[学习笔记] Miller-Rabin质数测试 Pollard-Rho质因数分解
Miller-Rabin质数测试 & Pollard-Rho质因数分解 考试遇见卡质因数分解的题了...活久见...毒瘤lun 于是就学了一发qaq Pollard-Rho分解质因数的话需要依 ...
- Python判断质数合数,质因数分解并得到所有因数
Python判断质数合数,质因数分解并得到所有因数 判断质数.合数 质因数分解 得到所有正因数 完整程序 运行效果 判断质数.合数 要判断一个大于一的正整数是质数还是合数,只需判断在区间[2, √x] ...
最新文章
- linux java 构建工具有哪些,Linux ant --强大的Java开发构建工具
- python-web自动化-Python+Selenium之expected_conditions:各种判断
- Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解
- pytorch中的CrossEntropyLoss
- 视频技术详解:RTMP H5 直播流技术解析
- 自考计算机及应用心得体会,自考中文专业的心得体会
- Codeforces A - Bear and Prime 100(交互题)
- 收文处理和发文处理的环节_公文处理,如何提速增效
- connot+connect+mysql+127.0.0.1_无法远程连接 MySQL 的解决方法
- gtx1050ti最稳定的驱动_最便宜图灵吃鸡卡 华硕GTX 1650评测
- 7、IPsec 实验
- 信号与线性系统分析(吴大正,郭宝龙)(5-系统定义与典型系统)
- PCL_点云数据处理方法概述
- 干眼能从事计算机工作吗,上班族长时间面对电脑须谨慎干眼症
- 企业微信4.0:上下游功能上线,用一款APP连接所有企业组织和用户
- Python 字符串重复判断
- 隐马尔科夫模型HMM自学
- 你的程序员是在努力工作还是在偷懒?
- win10自动修复无法修复你的电脑的解决方法(操作+原理理解)
- starrocker关联hive外表