素数

本文介绍了素数的概念,算术基本定理,以及如何进行质因数分解。此外,还探讨了短除法分解质因数的算法,素数测试的方法,包括Eratosthenes筛法,以及欧拉函数的定义、性质和计算公式。最后,讨论了大数分解和素数判定中的Miller-Rabin算法,该算法基于费马小定理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、素数

1、素数:素数(prime number)又称质数,有无限个。素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为素数。
2、算术基本定理:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。 //寻找自然数的素因子,并通过算式表示
例如:6936=2^3*3*17^2,1200=2^4*3*5^2。

二、 质因数分解

1、质因数分解:把一个合数用素因数相乘的形式表示出来,叫做质因数分解。
2、算法实现:
①先用一个能整除这个合数的素数(通常从最小的开始)去除。
②得出的商如果是合数,再按照上面的方法继续除下去,直到得出的商是素数为止。
③然后把各个除数和最后的商按从小到大的顺序写成连乘的形式。
重点内容
一个自然数n=sqrt(n)*sqrt(n)
所以,如果在小于sqrt(n)的范围内有一个素因子,那么在sqrt(n)到n的范围内肯定也有一个素因子,所以在算法实现时,为了优化算法,在for循环中执行到i

三、短除法分解质因数

1、算法实现:
cnt=0; //cnt指素因子个数
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
++cnt;
p[cnt]=i;//p数组存放素因子
num[cnt]=0;
while(n%i==0)
{
++num[cnt];//num数组存放指数
n/=i;
}
}
}
if(n>1)//因为判断到sqrt(n)所以需要最后做n>1的判断
{
++cnt;
p[cnt]=n;
num[cnt]=1;
}

四、素数测试

bool divisibiity_test(int n)
{
//一个数至少有一个比sprt(n)小的质因数。
for (int i=2; i<=sqrt(n); i++)
if (n % i == 0)
return false;
return true;
}

五、Eratosthenes筛法

算法描述:
1.列出所有正整数。
2.从2开始,删掉 2 的倍数。找下一个未被删掉的数字。
3.找到 3 ,删掉 3 的倍数。找下一个未被删掉的数字
4.找到 5 ,删掉 5 的倍数。

重复步骤,就能删掉所有合数,找到所有质数
算法实现:
bool prime[20000000];
void eratosthenes()
{
memset(prime,1,sizeof(prime));
prime[0] = 0; prime[1] = 0; // 0 和 1 不是质数
for (int i=2; i<20000000; i++)
if (prime[i]==1) // 删掉质数i的倍数
for (int j=i*i; j<20000000; j+=i)//删掉质数 i 的倍数时,早已删掉1 倍~ i-1 倍之间的合数了,所以直接从i倍开始删除。
prime[j] = 0;
}

六、欧拉函数

1、①定理:对正整数n,欧拉函数φ(phi)指是小于n的所有数中与之互质的个数(包含1)。如φ(8)=4,因为1,3,5,7均和8互质。

②表达形式:这里写图片描述

③计算公式:这里写图片描述
例如:φ(8)=4有1,3,5,7,8=2^3, φ(8)=8*(1-1/2)=4.
φ(10)=4有1,3,7,9 ,10=2*5,φ(10)=10*(1-1/2)*(1-1/5)=4.
④性质:
a)当p为质数时, φ(p) = p – 1
证明:因为小于本身的数都与该数互质,但是注意φ(1)=1.
b)对于互质的正整数a和n,有a^φ(n) %n≡ 1 (mod n的意思是两边同时%n).
c)费马小定理:若正整数a 与素数p 互质,则有a^(p - 1)%p≡1
证明:由于性质a可知当p为质数,φ(p) = p -1,代入性质b即可证明。
d)当n为奇数时φ(2n)=φ(n).
e)当n和m互质时,φ(n*m)=φ(n)*φ(m).
f)若n=p^k(p为质数),φ(n)=p^k-p^(k-1).
证明:因为除了p的倍数外,其他数都跟n互质。
算法实现
1.根据公式1:n=p1^k1*p2^k2*…pr^kr和公式2:φ(n)=n (1-1/p1) (1-1/pr)。
2.可将公式2可拆成n* (1-1/p1)=n-n/p1计算。
int euler(int n)
{
int i,ans=n;
for(i=2; i*i<=n; i++)
if(n%i==0)
{
ans=ans-ans/i;
do
n/=i;//把该素因子全部约掉
while(n%i==0);
}
if(n>1)
ans=ans-ans/n;
return ans;
}

七、大数分解及素数判定

1.Miller-rabin算法:Miller-rabin算法是一个用来快速判断一个正整数是否为素数的算法。

它利用了费马小定理,即:如果p是质数,且a,p互质,那么a^(p-1) %p恒等于1。也就是对于所有小于p的正整数a来说都应该符合a^(p-1) % p恒等于1,因为质数p的欧拉数=p-1。

那么根据逆否命题,对于一个p,我们只要举出一个a(a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值