Python 这个最大素因子查找算法是如何工作的?

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

我在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 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