1:费马小定理
我看好多博客在范围方面没有给清楚,我自己推了一下,给一个比较清晰的概念:
如果p是一个质数且a不是p的倍数,那么a^(p-1)≡1(mod p)。
那么如果p是一个质数,a是p的倍数呢??大家可以手推一下!a=kp,(kp)^(p-1)%p=1%p;坐便等于0;右边等于1;所以不成立,但是此时我们可以给一个统一式子!
对于质数p,任意整数a,均满足:a^p≡a(mod p)
这个式子包含了所有情况!讨论a是不是p的倍数。
1:假如不是,右边不为0,两边同时除以右边,得到费马小定理的最基本的式子;
2:假如是,右边为0,不可以同时除以a,a=kp,左右两边都等于0;
2:威尔逊定理
假如p为素数,则(p-1)!≡-1(mod p)
关于证明点击这里,写得还算清楚
但是有一个有趣的现象,威尔逊定理的逆也是正确的!
假如n>=2;如果(n-1)!≡-1(mod n) 那么 n是素数!
3:欧拉定理
若正整数 a , n 互质,则 a^φ(n)≡1(mod n) 其中 φ(n) 是欧拉函数(1~n) 与 n 互质的数。
欧拉定理的证明
欧拉定理的推论:
若正整数a,n互质,那么对于任意正整数b,有a^b≡a^(b mod φ(n))(mod n)
更牛逼的来了
欧拉定理的拓展公式(公式这么多,记住并不难,大家都是经历过高考的)
当a,n不互质的时候,我们也有办法对指数进行取模,简化运算:
欧拉定理的扩展: a^b≡a^(bmodϕ(m)+ϕ(m))mod(m) b≥ϕ(m)
4:中国剩余定理(孙子定理)
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。
在《孙子歌诀》中给出了解决这个问题的解法:三人同行七十稀,五树梅花廿一支,七子团圆正半月,除百零五便得知。很是朗朗上口,但这是什么意思呢?
具体解法分三步:
找出三个数:
1.从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。
2.用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数),然后把三个乘积相加(15*2+21*3+70*2)得到和233。
3.用233除以3,5,7三个数的最小公倍数105,得到余数23,即233%105=23。这个余数23就是符合条件的最小数。
就这么简单。我们在感叹神奇的同时不禁想知道古人是如何想到这个方法的,有什么基本的数学依据吗?
用现代数学的语言来说明的话,中国剩余定理给出了以下的一元线性同余方程组:
有解的判定条件,并用构造法给出了在有解情况下解的具体形式。
中国剩余定理说明:假设整数m1,m2, ... ,mn两两互质,则对任意的整数:a1,a2, ... ,an,方程组有解,并且通解可以用如下方式构造得到:
设 是整数m1,m2, ... ,mn的乘积,并设是除了mi以外的n- 1个整数的乘积。设 为模的数论倒数(为模意义下的逆元)
方程组的通解形式为
在模的意义下,方程组只有一个解:
模板是:
中国剩余定理
有一个最小的数t
t%2=1
t%3=1
…
///不存在的话输出-1
#include
#include
#include
using namespace std;
typedef long long ll;
ll a[1000],b[1000];
ll Mod;
ll gcd(ll a, ll b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
ll Extend_Euclid(ll a, ll b, ll&x, ll& y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll d = Extend_Euclid(b,a%b,x,y);
ll t = x;
x = y;
y = t - a/b*y;
return d;
}
//a在模n乘法下的逆元,没有则返回-1
ll inv(ll a, ll n)
{
ll x,y;
ll t = Extend_Euclid(a,n,x,y);
if(t != 1)
return -1;
return (x%n+n)%n;
}
//将两个方程合并为一个
bool merge(ll a1, ll n1, ll a2, ll n2, ll& a3, ll& n3)
{
ll d = gcd(n1,n2);
ll c = a2-a1;
if(c%d)
return false;
c = (c%n2+n2)%n2;
c /= d;
n1 /= d;
n2 /= d;
c *= inv(n1,n2);
c %= n2;
c *= n1*d;
c += a1;
n3 = n1*n2*d;
a3 = (c%n3+n3)%n3;
return true;
}
//求模线性方程组x=ai(mod ni),ni可以不互质
ll China_Reminder2(int len, ll* a, ll* n)
{
ll a1=a[0],n1=n[0];
ll a2,n2;
for(int i = 1; i < len; i++)
{
ll aa,nn;
a2 = a[i],n2=n[i];
if(!merge(a1,n1,a2,n2,aa,nn))
return -1;
a1 = aa;
n1 = nn;
}
Mod = n1;
return (a1%n1+n1)%n1;
}
int main()
{
int i;
int k;
while(scanf("%d",&k)!=EOF)
{
for(i = 0; i < k; i++)
scanf("%lld %lld",&a[i],&b[i]);
printf("%lld\n",China_Reminder2(k,b,a));
}
return 0;
}