一道有趣的数学题分享

离散对数(洛谷P12540)

题目描述:

给定正整数 a, c, p,保证 p 是 素数,求 b 使得:a^{b}\equiv b^{c}(mod p)

我们称整数 A,B,C 有 A≡B(modC),当且仅当存在整数 k 使得 a-b=c*k

解题思路:

这道题若a,p互质,则根据费马小定理得到a^{p - 1}\equiv 1(modp),根据题中的式子就可以得出a^b \equiv a^{b mod (p-1)} modp.所以就有a^{b} mod p = a^{(k*p +b mod p) mod (p-1)} mod p将这个式子再度展开就可以得到a^{(b mod p) mod (p-1) + k*p mod (p-1)} mod p。但  kp mod (p-1)  等于k mod(p-1)*p mod(p-1). 因为p \equiv 1 mod(p-1),所以p = 1 mod(p-1). 所以 k p mod (p - 1) =k * 1 mod(p-1) =k mod(p-1). 所以b= kp+s \rightarrow b mod(p-1) = (k +s) mod(p-1).

但是我们又希望a^{b} mod p = a^{ (k +bmodp) mod (p-1) } mod p.同时b^c modp = (kp +bmodp)^c modp。由于kp \equiv 0 modp,所以条件变成了a^{ (k +bmodp) mod (p-1) } \equiv (bmodp)^c modp.要满足这个等式我们就需要选择k使得满足上述条件,我们可以令bmodp=amodp,此时,右边的(bmodp)^c modp等于a^c mod p,而对于左边来说我们希望能让这一部分等于a^c mod p所以,可以令 (k +bmodp) mod (p-1) \equiv c mod(p-1). 因为如果这样的话,左边就是a^c mod p,而右边同样也是a^c mod p此时等式成立。

所以,要满足k + bmodp \equiv c mod(p-1). 因此,k \equiv (c -bmodp) mod(p-1) 所以,k可以等于(c -bmodp) mod(p-1) + t*(p-1),其中t是任意整数。那么此时我们就可以推出结论b = [(c -bmodp) mod(p-1)] *p +bmodp + t*(p-1)*p

解决代码

#include<bits/stdc++.h>
#define endl "\n"

using namespace std;
typedef long long LL;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    LL a,b,c,p;
    cin >> a >> c >> p ;

    LL n = a % p;
    LL m = c % (p - 1);
    LL k = (m - n) % (p - 1);
    if(k < 0)
        k += (p - 1);
    if(p == 1)
        cout << 1;
    else
    {
        cout <<k * p  + n;
    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值