用于打印给定数字的所有素数的高效程序的Python程序
给定一个数字 n,编写一个有效的函数来打印 n 的所有素因数。例如,如果输入数字是 12,那么输出应该是“2 2 3”。如果输入数字是 315,那么输出应该是“3 3 5 7”。
以下是找到所有主要因素的步骤。
1)当 n 可以被 2 整除时,打印 2 并将 n 除以 2。
2)在第 1 步之后,n 必须是奇数。现在开始一个循环,从 i = 3 到 n 的平方根。当 i 除以 n 时,打印 i 并将 n 除以 i,将 i 增加 2 并继续。
3)如果n是素数并且大于2,那么经过以上两步,n不会变成1。因此,如果 n 大于 2,则打印 n。
# Python program to print prime factors
import math
# A function to print all prime factors of
# a given number n
def primeFactors(n):
# Print the number of two\'s that divide n
while n % 2 == 0:
print 2,
n = n / 2
# n must be odd at this point
# so a skip of 2 ( i = i + 2) can be used
for i in range(3,int(math.sqrt(n))+1,2):
# while i divides n , print i ad divide n
while n % i== 0:
print i,
n = n / i
# Condition if n is a prime
# number greater than 2
if n > 2:
print n
# Driver Program to test above function
n = 315
primeFactors(n)
# This code is contributed by Harshit Agrawal
输出:
3 3 5 7
这是如何运作的?
第 1 步和第 2 步处理合数,第 3 步处理素数。为了证明完整的算法有效,我们需要证明第 1 步和第 2 步实际上处理了合数。很明显,第 1 步处理的是偶数。并且在步骤 1 之后,所有剩余的素因数必须是奇数(两个素因数的差必须至少为 2),这解释了为什么 i 增加 2。
现在主要部分是,循环一直运行到 n 的平方根,而不是直到。为了证明这种优化是有效的,让我们考虑以下合数的性质。
每个合数至少有一个质因数小于或等于其自身的平方根。
这个性质可以用 counter 语句来证明。设 a 和 b 是 n 的两个因数,使得 a*b = n。如果两者都大于√n,则ab > √n,*√n,这与表达式“a * b = n”相矛盾。
在上述算法的第 2 步中,我们运行一个循环并在循环中执行以下操作
a) 找到最小的质因子 i(必须小于 √n,)
b) 通过重复将 n 除以 i,从 n 中删除所有出现的 i。
c) 对除数 n 和 i = i + 2 重复步骤 a 和 b。重复步骤 a 和 b,直到 n 变为 1 或素数。
请参阅有关高效程序的完整文章以打印给定数字的所有质因数以获取更多详细信息!