一、同余
1、如果a-b = km,那么a%mod = (b+km)%mod = b%mod
2、对于相加或相乘,无论是在最后结果取余还是过程中每次取余,最终结果都一样
二、最大公因数(gcd)和最小1公倍数(lcm)
a,b的最大公因数和最小公倍数满足:gcd(a,b)*lcm(a,b) = ab.
所以,lcm(a,b) = a * b // gcd(a,b)
三、唯一分解定理
1、定义
比如18 = 2*3*3 = 2^1 * 3^2
2、代码
以下是基于python的得到一个数的质因子(质因数)的实现方法,输入24,得到[2,2,2,3]
# 基础代码
n = int(input())
ans = []
for i in range(2,n+1):
if n%i == 0:
while n%i == 0:
n = n//i
ans.append(i)
if n == 1: # 这个只存在于输入的n本身就是一个质数的情况
break
print(ans)
# 改进代码,统计质因数个数
n = int(input())
ans = 0
a = n
for i in range(2,int(n**(0.5)+1)):
if a%i==0:
ans += 1
while a%i == 0:
a = a//i
if a==1: # 经过多次整除,如果得到的是1,1不是质数,那么说明答案就是ans
print(ans)
else: # 经过多次整除,还有没有除完的,比如6//2=3,剩下的3也是质数,应该加1
print(ans+1)
3、为什么只需要枚举到sqrt(n)?
大于sqrt(n)的质因数最多只有一个,或者没有,不可能出现多个(比如34的质因数有2*17),如果有多个大于sqrt(n)的质因数,那么他们的乘积就会超出n
4、性质:
四、质数判定和埃氏筛法筛选质数
质数判定
任何一个自然数,总可以表示成以下六种形式之一:6n,6n+1,6n+2,6n+3,6n+4,6n+5(n=0,1,2...)我们可以发现,除了2和3,只有形如6n+1和6n+5的数有可能是质数。且形如6n+1(即i+2)和6n+5(也可以说成6n-1)的数如果不是质数,它们的因数也会含有形如6n+1或者6n-1的数
def is_prime(n):
if n <= 1:
return False
if n == 2 or n == 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
for i in range(5, int(n ** 0.5) + 1, 6):
if n % i == 0 or n % (i + 2) == 0:
return False
return True
埃氏筛法
1、埃氏筛法的基本思想 :从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。
2、给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去……
# 以下代码可以快速找出一亿以内所有质数
n = 10**8
s = [0]*(n+1) # 0表示是质数,1表示不是质数
k=0
for i in range(2,n+1):
if s[i]==0: # 是质数
k+=1 # 质数数量加一
for j in range(i+i,n+1,i): # 把该质数的所有倍数都去掉
s[j]=1 # 打标记,1表示不是质数
# s[i]=0,说明是质数
# s[i]=1,说明不是质数