欧拉函数,欧拉公式,降幂公式

欧拉函数

欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。(例如φ(8)=4,因为1,3,5,7均和8互质。)
通式:
其中p1, p2……pn为x的所有质因数,x是不为0的整数。在这里插入图片描述
其中p1, p2……pn为x的所有质因数,x是不为0的整数。
质因数:质因数(素因数或质因子)在数论里是指能整除给定正整数的质数。

int ouler(int n)
{
    int number = 1, i;
    for(i=2; i*i <= n; i++)
    {
        if(n%i == 0)
        {
            n =n/ i;
            number *= (i-1);
            while(n%i == 0)
            {
                n /= i;
                number *= i;
            }
        }
    }
    if(n > 1)
        number *= (n-1);
    return number;
}

欧拉定理

若n,a为正整数,且n,a互质,则:
这里是引用

降幂

a b ≡ { a b % φ ( n ) ( &VeryThinSpace; m o d &VeryThinSpace;   n )                    n , a 互 质 a b ( &VeryThinSpace; m o d &VeryThinSpace;   n )                          b &lt; φ ( n ) a b % φ ( n ) + φ ( n ) ( &VeryThinSpace; m o d &VeryThinSpace;   n )          b ≥ φ ( n ) a^b\equiv \left\{ \begin{aligned} a^{b\%\varphi(n)}(\bmod\ n)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ n,a互质\\ a^b (\bmod\ n)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ b&lt;\varphi(n)\\ a^{b\%\varphi(n)+\varphi(n)}(\bmod\ n)\ \ \ \ \ \ \ \ b\geq\varphi(n) \end{aligned} \right. abab%φ(n)(mod n)                  n,aab(mod n)                        b<φ(n)ab%φ(n)+φ(n)(mod n)        bφ(n)

#include <stdio.h>
#include <string.h>
int main()
{
    long long int a,p;
    long long int b=0;
    char s[100];
    printf("底数 指数 模数\n");
    scanf("%lld %s %lld",&a,s,&p);
    int phi=ouler(p),len=strlen(s);
    printf("phi(%lld)=%d\n",p,phi);
    for(int i=0; i<len; i++)
        b=(b*10+s[i]-'0')%phi;
    int result=quickpow(a,b+phi,p);
    printf("%d",result%p);
}
int quickpow(long long int a,long long int b,long long int p)
{
    long long int r=1,base=a;
    while(b)
    {
        if(b%2)
            r=r*base%p;
        base=base*base%p;
        b=b/2;
    }
    return r;
}
int ouler(int n)
{
    int result=n;
    for(int i=2; i*i<=n; i++)
    {
        if(n%i==0)
        {
            n=n/i;
            result=result*(i-1)/i;
            while(n%i==0){
                n=n/i;
            }
        }
    }
    if(n>1)
        result=result*(n-1)/n;
    return result;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值