数论这东西,对于我学起来还是比较吃力的,特作此篇
∙
\bullet
∙不用二进制和位运算的龟速乘板子
long long gsc(long long a,long long b,long long p)
{
while(a){ans+=((a%10)*b%q)%q;ans%=q;b=b*10%q;a/=10;}
return ans;
}
∙ \bullet ∙ 线性筛筛质数一点也不详的解与算术基本定理
int v[maxn],prime[maxn];
int getprimes(int n)
{
int m=0;
for(int y=2;y<=n;y++)
{
if(v[y]==0) {v[y]=y;prime[++m]=y;}
for(int i=1;i<=m;i++)
{
int x=prime[i];
if(x>v[y]) break;
if(x*y>n) break;
int z=x*y;
v[z]=x;
}
}
return m;
}
∙
\bullet
∙最大公约数gcd和最小公倍数lcm
板子:
int gcd(int x,int y)
{
if(y==0) return x;
else return gcd(y,x%y);
}
int lcm(int x,int y)
{
return (a*b/gcd(a,b));
}
∙
\bullet
∙同余,同余类,剩余系的定义
∙
\bullet
∙费马小定理看了等于没看证明
∙
\bullet
∙欧拉函数巨水解
求一个
ll eular(ll n)
{
ll ans=n;
for(int i=2;i*2<=n;i++)
{
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
筛
int euler[N],cnt,primes[N];
bool st[N];
void get_eulers(int n)
{
euler[1]=1;
for(int i=2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++]=i;
euler[i]=i-1;
}
for (int j=0;primes[j]<=n/i;j++)
{
int t=primes[j]*i;
st[t]=true;
if (i%primes[j]==0)
{
euler[t]=euler[i]*primes[j];
break;
}
euler[t]=euler[i]*(primes[j]-1);
}
}
}
∙
\bullet
∙欧拉定理算是费马小定理的推论吧
∙
\bullet
∙由裴蜀定理到扩展欧几里得
∙
\bullet
∙中国剩余定理又叫孙子定理