码迷,mamicode.com
首页 > 其他好文 > 详细

#数论学习总结

时间:2019-10-03 18:18:59      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:exgcd   size   include   数学推导   sdn   phi   因此   scanf   fine   

一.辗转相处模板&&扩欧求逆元模板

blog:https://blog.csdn.net/m0_37579232/article/details/81428065

https://blog.csdn.net/m0_37579232/article/details/89810566

int gcd(int x,int y)
{
return y?gcd(y,x%y):x;
}


//exgcd 扩欧求逆元

int exgcd(int a,int b,int &x,int &y)//calc ax+by=gcd(a,b);
{
if(b==0)
{
x=1,y=0;
return a;
}
int g=exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}


int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
else
{
int g=exgcd(b,a%b,y,x);
y-=a/b*x;
return g;
}
}

注意以下情况:
1.如果要求解ax+by=k不定方程的解,当且仅当k|gcd(a,b)时有解
2.求ax+by=k的解,先求ax+by=gcd(a,b)的解,
那么x0=x*k/gcd(a,b),y0=y*k/gcd(a,b);为所需的解
3.如何求该不定方程的最小正整数解??
x=((x*K/gcd(a,b))%(b/gcd(a,b))+(b/gcd(a,b)))%(b/gcd(a,b));

二.欧拉函数

https://baike.baidu.com/item/%E6%AC%A7%E6%8B%89%E5%87%BD%E6%95%B0/1944850?fr=aladdin

https://blog.csdn.net/sentimental_dog/article/details/52002608

/欧拉函数
//法一:根据定义直接得出
int euler(int n)
{
int res=n,a=n;
for(int i=2;i*i<=a;i++)
{
if(a%i==0)
res=res/i*(i-1);
while(a%i==0)
a/=i;
}
if(a>1) res=res/a*(a-1);
return res;
}
//法二:同时完成欧拉筛+欧拉函数的计算
int m[N],phi[N],p[N],nump;
//m存储第i个数是否为素数,phi[i]存储第i个数的欧拉函数值
//p[i]存储第i个素数,nump存储p数组的大小
void calc()
{
phi[1]=1;
for(int i=1;i<=n;i++)
{
if(!m[i])
{
p[++nump]=i;
phi[i]=i-1;
}
else
{
for(int j=1;j<=nump&&p[j]*i<=n;j++)
{
m[p[i]*i]=1;
if(i%p[j]==0)
phi[i*p[j]]=phi[i]*p[j];
else
phi[i*p[j]]=phi[i]*(p[j]-1);
}
}

}
}

三.筛法求素数

https://www.luogu.org/problemnew/solution/P3383

例题:https://www.luogu.org/problem/P3383

#include<cstdio>
#include<cstring>
#define N 10000002
using namespace std;
int n,m,pn,t;
bool prime[N];
int Prime[N];
inline void Sieve()
{
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(int i=2;i<=n;i++)
{
if(prime[i])
{
Prime[pn++]=i;
}
for(int j=0;j<pn&&Prime[j]*i<=n;j++)
{
prime[Prime[j]*i]=false;
if(i%Prime[j]==0)
break;
}
}
return;
}
int main()
{
scanf("%d %d",&n,&m);
Sieve();
for(int i=1;i<=m;i++)
{
scanf("%d",&t);
if(prime[t])
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

四.积性函数

https://baike.baidu.com/item/%E7%A7%AF%E6%80%A7%E5%87%BD%E6%95%B0/8354949?fr=aladdin

五.费马小定理

对于素数p和整数a,若(a,b)=1,则a的p-1次幂膜p余1;

引理1.
  若a,b,c为任意3个整数,m为正整数,且(m,c)=1,则当a·c≡b·c(mod m)时,有a≡b(mod m)。
  证明:a·c≡b·c(mod m)可得ac–bc≡0(mod m)可得(a-b)·c≡0(mod m)。因为(m,c)=1即m,c互质,c可以约去,a– b≡0(mod m)可得a≡b(mod m)。 [2] 
引理2.
  设m是一个整数且m>1,b是一个整数且(m,b)=1。如果a[1],a[2],a[3],a[4],…a[m]是模m的一个完全剩余系,则b·a[1],b·a[2],b·a[3],b·a[4],…b·a[m]也构成模m的一个完全剩余系。
  证明:若存在2个整数b·a[i]和b·a[j]同余即b·a[i]≡b·a[j](mod m)..(i>=1 && j>=1),根据引理1则有a[i]≡a[j](mod m)。根据完全剩余系的定义可知这是不可能的,因此不存在2个整数b·a[i]和b·a[j]同余。
所以b·a[1],b·a[2],b·a[3],b·a[4],…b·a[m]构成模m的一个完全剩余系。
构造素数
技术图片
 的完全剩余系
技术图片
因为
技术图片
 ,由引理2可得
技术图片
也是p的一个完全剩余系。由完全剩余系的性质,
技术图片
技术图片
易知
技术图片
 ,同余式两边可约去
技术图片
 ,得到
技术图片
这样就证明了费马小定理。 [3]

应用

编辑
计算
技术图片
 除以13的余数
技术图片
技术图片
技术图片
技术图片
技术图片
六.威尔逊定理
初等数论中,威尔逊定理给出了判定一个自然数是否为素数充分必要条件。即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p ),但是由于阶乘是呈爆炸增长的,其结论对于实际操作意义不大,但借助计算机的运算能力有广泛的应用,也可以辅助数学推导。

#数论学习总结

标签:exgcd   size   include   数学推导   sdn   phi   因此   scanf   fine   

原文地址:https://www.cnblogs.com/little-cute-hjr/p/11620127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!