• 欧拉函数(欧拉定理)与费马小定理


    详细的证明忽略。只记录使用场景。

    欧拉函数

    欧拉函数varphi(n)(nin N^*)是小于等于 n 的正整数中与 n 互质的数的个数。

    欧拉定理

    使用条件为a和n互质,即gcd(a,n)=1

    对于任意互素的a和n,有a^{varphi(n)}equiv1(mod n)

    • 方法1:求单个数的欧拉函数

    我们首先应该要知道欧拉函数的通项公式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中pi为n的质因数

    long long eular(long long n)
    {
        long long ans = n;
        for(int i = 2; i*i <= n; i++)
        {
            if(n % i == 0)
            {
                ans -= ans/i; //等价于通项,把n乘进去
                while(n % i == 0) //确保下一个i是n的素因数
                    n /= i;
            }
        }
        if(n > 1)ans -= ans/n; //最后可能还剩下一个素因数没有除
        return ans;
    }
    • 方法2: 打表求欧拉函数

    void euler()  
    {  
        for(int i=2;i<maxn;i++){  
            if(!phi[i])  
            for(int j=i;j<maxn;j+=i){  
                if(!phi[j]) phi[j]=j;  
                phi[j]=phi[j]/i*(i-1);  
            }  
        }  
    }
    • 方法3: 欧拉筛素数同时求欧拉函数

    void get_phi()  
    {  
        int i, j, k;  
        k = 0;  
        for(i = 2; i < maxn; i++)  
        {  
            if(is_prime[i] == false)  
            {  
                prime[k++] = i;  
                phi[i] = i-1;  
            }  
            for(j = 0; j<k && i*prime[j]<maxn; j++)  
            {  
                is_prime[ i*prime[j] ] = true;  
                if(i%prime[j] == 0)  
                {  
                    phi[ i*prime[j] ] = phi[i] * prime[j];  
                    break;  
                }  
                else  
                {  
                    phi[ i*prime[j] ] = phi[i] * (prime[j]-1);  
                }  
            }  
        }  
    }  

    方法四 :欧拉降幂

    然后使用欧拉定理实现简化幂的模运算。比如计算7^{222}的个位数,实际是求7^{222}被10除的余数。7和10[互素],且φ(10)=4。由欧拉定理知7^4Ξ1(mod 10)。所以7^{222}=(7^4)^55*(7^2)Ξ1^{55}*7^2Ξ49Ξ9 (mod 10)。于是该7^{222}的个位数就是9。

    while(scanf("%lld %s %lld",&x,a,&z) != EOF)//输入x,a,z,求x^a%z
        {
            ll len = strlen(a);
            ll p = phi(z);
            ll ans = 0;
            for(ll i = 0;i < len; i++)
                ans = (ans*10 + a[i]-'0')%p;//a%p的余数
            ans += p;
            printf("%lld
    ", quickpow(x, ans, z));
        }

    其余性质:

    1:欧拉函数性质:N>1,不大于N且和N互素的所有正整数的和是 1/2*M*eular(N)。

    ②若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;

    ③若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);

    费马小定理

    费马小定理(Fermat's little theorem)是数论中的一个重要定理,在1636年提出。如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。 

    费马小定理是欧拉定理的一种特殊情况,即p为质数,a不是p的整数,应该是不要求互质,还没有刷题。

  • 相关阅读:
    poj3723Conscription
    hiho1304 24点
    hdu2089不要62
    hdu3555Bomb
    关于分割平面问题
    poj2976Dropping tests(01分数规划)
    linux命令行
    java内存不足
    如何设置jsp默认的编码为utf-8
    visul svn+花生壳
  • 原文地址:https://www.cnblogs.com/wjune-0405/p/11729365.html
Copyright © 2020-2023  润新知