1038 X^A Mod P N次剩余(51nod)高次同余 离散对数

该博客介绍了如何解决形如X^A Mod P = B的高次同余问题,其中P是质数。通过原根和离散对数的概念,给出了解决此类问题的方法,并给出了具体示例,例如P = 11, A = 3, B = 5。解的数量不超过P的平方根。" 21187863,1320338,使用CloseHandle与ConvertStringSecurityDescriptorToSecurityDescriptor,"['Windows API', '文件操作', '进程管理', '线程管理', '系统安全']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

X^A mod P = B,其中P为质数。给出P和A B,求< P的所有X。

例如:P = 11,A = 3,B = 5。

3^3 Mod 11 = 5

所有数据中,解的数量不超过Sqrt(P)。

input:

3
11 3 5
13 3 1
13 2 2

output:

3
1 3 9
No Solution

解:

g为p的原根,p为素数,所以phi(p)=p-1。
原根的性质得:如果g为p的原根,则:g^i mod p != g^j mod p (p为素数),

其中i != j且i, j介於1至(p-1)之间

所以,可以设g^y=x, g^t=a,则有:
g^(y*N)%p=g^t
又由原根的性质:
g^(y*N)%p=g^t -> (y*N)%(p-1)=t (拓展欧几里得解)
另外g^t=a可以由离散对数求出
 

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 100005;
bool pd[maxn];
ll pri[maxn],ans[maxn];;
vector<ll> phipri;
map<ll,ll> mp;
int t,num,cnt;
ll p,a,b,g,phip;

void pre() {
	for(int i=2; i<=maxn-5; ++i) {
		if(!pd[i]) pri[++num]=i;
		for(int j=1; j<=num&&i*pri[j]<=maxn-5; ++j) {
			pd[i*pri[j]]=1;
			if(i%pri[j]==0) break;
		}
	}
}

ll ksm(ll x,ll y,ll mod)
{
    ll 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值