Python 这个最大素因子查找算法是如何工作的?
我在YouTube在线视频中看到一个家伙用一种看似简单的方法找到了一个数字中最大的素因子,但我不太懂它的数学原理。这是链接 该守则—Python 这个最大素因子查找算法是如何工作的?,python,algorithm,math,primes,Python,Algorithm,Math,Primes,我在YouTube在线视频中看到一个家伙用一种看似简单的方法找到了一个数字中最大的素因子,但我不太懂它的数学原理。这是链接 该守则— n=1234 # Some number whose largest factor I want to find i=2 # It seems that he tries to start from the smallest prime number while i**2<n: # I don't understand this part where he
n=1234 # Some number whose largest factor I want to find
i=2 # It seems that he tries to start from the smallest prime number
while i**2<n: # I don't understand this part where he checks if the square of variable is less than the target number
while n%i==0: # I know this checks if n is divisible by i
n/=i
i+=1 # increments i's value
print(n)
n=1234#我想找到其最大因子的某个数字
i=2#他似乎试图从最小的素数开始
而i**2如果你的数字N
可以被i
整除(换句话说,i
是N
的一个因子),并且i
大于sqrt(N)
,那么肯定还有N
的另一个因子,称之为J=N/i
,小于sqrt(N)
如果您彻底搜索了I
之前的所有潜在因素,您一定已经找到了J
,因此您在前面介绍了该分解
我们正在寻找最大的素数因子,因此问题仍然是终止循环时的最终N
是否为素数
每当我们遇到一个系数N
,我们就用这个系数除以N
,因此当考虑一个潜在系数I
时,我们可以确定当前的N
将不再有低于I
的任何系数
终止循环时,最终的N
是否可以由多个因子组成(即,不是素数)
没有
如果N不是素数,它必须由K
和L
(N=K*L
)组成,K
和L
必须都大于sqrt(N)
,否则我们在前面的步骤中会除以K
或L
。但将两个数字相乘,每个都大于sqrt(N)
,将始终大于N
,违反N=K*L
因此,假设最后的N
不是素数,就会产生矛盾,因此我们可以确定最后的N
是原始N
的一个因子,这个因子确实是一个素数
原始代码的注意事项(谢谢JohanC):
原始代码检查I
是否严格小于SQRT(N)
(while i**2我想你错过了外部while循环的i+=1
?可能会有帮助。我不确定算法是否正确,因为i
始终是2
。运行49或25次算法它确实适用于所有实数正数;我尝试过的测试用例都没有失败。你没有解释代码的原因不适用于9、75等数字。而i**2i和n%i==0:
可能会有所帮助。此外,使用整数除法(n/=i
)对于某些浮点除法可能出错的大数可能有用。@JohanC您是对的,原始代码中似乎有一个错误。在中,您仍然需要中的'n>i`in而在n>i和n%i==0:
中,以避免在最高因子的重数大于的所有情况下返回1作为答案1.而我**2