欧拉定理(数论定理)在 模幂运算中的应用

< 前言 >  

在很多情况下,我们经常会遇到很大的数a和b,求a的b 次幂中的某位数是什么,对于运算,用暴力求解往往会溢出,并且非常麻烦。

而 利用模运算性质和 欧拉定理中的数论定理,则可方便求解超高次幂相关问题。


 

 

欧拉定理(数论定理) 内容

数论中,欧拉定理,(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数,且n,a互质,则:

                                                                     

注: mod为模运算符,在某些地方可表为%

φ(n)为1~n中与n互质的数个数)

具体证明见 https://baike.baidu.com/item/%E6%AC%A7%E6%8B%89%E5%AE%9A%E7%90%86/891345?fr=aladdin#2_2

欧拉的递推式为:

 

 

具体用法

例如,我们想知道3333^5555的末位是什么。很明显不可能直接把3333^5555的结果计算出来,那样太大了。但我们想要确定的是3333^5555(%10),所以问题就简化了。

根据  模运算规则 a^b % p = ((a % p)^b) % p ,我们知道3333^5555(%10)= 3^5555(%10)。

根据 模运算规则 (a * b) % p = (a % p * b % p) % p ,由于5555 = 4 * 1388 + 3,我们得到

3^5555(%10)

=(3^(4*1388) * 3^3)(%10)

=((3^(4*1388)(%10)* 3^3(%10))(%10)

=((3^(4*1388)(%10)* 7)(%10)。

 

化到此处即可使用 欧拉定理

对于3^(4*1388)而言,  3^(4*1388) = (3^4)^1388    (3^4)中Φ(n) = 4,即 n = 10(1,3,7,9满足);

同时 满足 3和10互质,

所以 3^(4*1388)=(1%10)^1388 = 1;

 

即 根据欧拉定理可以得到 3 ^ (4 * 1388) % 10 = 1,

所以((3^(4*1388)(%10)* 7)(%10)= (1 * 7) (% 10) = 7

计算完毕。

 

编程实现:

//欧拉函数
//求 1..n-1 中与 n 互质的数的个数
int eular(int n){
    int ret=1,i;
    for (i=2;i*i<=n;i++)
        if (n%i==0){
            n/=i,ret*=i-1;
            while (n%i==0)
                n/=i,ret*=i;
        }
    if (n>1)
        ret*=n-1;
    return ret;
}

例题:Super A^B mod C

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

12 26 25

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值