第一弹数论的主要内容有以下几部分:欧拉函数、埃式筛法、分解质因数、欧几里得算法、扩展欧几里得算法和模线性方程。
1、欧拉函数(连续求n个数的欧拉函数)
#include<iostream>
using namespace std;
int main()
{
int phi[100];// 用于筛法开素数表
int dive[100];//用于储存1~n的每个数的欧拉函数
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
phi[i]=i;
}
for(int i=2;i*i<=n;++i)
{
if(phi[i]==i)
{
for(int j=i*i;j<=n;j+=i)
{
phi[j]=i;
}
}
}
dive[1]=1;
for(int i=2;i<=n;++i)
{
dive[i]=dive[i/phi[i]];
if((i/phi[i])%phi[i]==0)
{
dive[i]*=phi[i];
}
else
{
dive[i]*=phi[i]-1;
}
}
for(int i=2;i<=n;i++)
cout<<dive[i]<<" ";
}
求单个数的欧拉函数:
int n,i,temp;
while(scanf("%d",&n)!=EOF)
{
temp=n;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
while(n%i==0) n=n/i;
temp=temp/i*(i-1);
}
if(n<i+1)
break;
}
if(n>1)
temp=temp/n*(n-1);
printf("%d\n",temp);
}
2、埃式筛法(用于打印素数表)
给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去.....
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int vis[10000];
int main()
{
int n;
cin>>n;
int m=sqrt(n+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;i++)
{
if(!vis[i])
{
for(int j=i*i;j<=n;j+=i)
{
vis[j]=1;
}
}
}
for(int i=2;i<=n;i++)
{
if(vis[i]==0)//最后剩下的vis[i]=0的都是质数
cout<<i<<" ";
}
}
下面贴一个埃式筛法的形象的展示:
3、分解质因数(模板)