数论四大定理(争取用最少的篇幅给你们讲解清楚)

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;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数学+数论)