原根与指标
参考资料
一.阶
1.定义:设是互质整数,必定有满足,最小的满足条件的正整数称为模的阶,记为,如果,则不存在阶。
2.性质:
<1>设是互质整数,存在满足,则。
<2>设是互质整数,有(根据欧拉定理反证)。
二.原根
1.定义:设为互质整数,若,则称是模的一个原根。
2.性质:
<1>只有(是奇素数)有原根。
<2>一个数若存在原根,则它有个原根。
<3>是的原根,模两两不同。即当是的原根时,构成了模的简化剩余系。
3.求一个数的原根:
暴力:
从开始暴力枚举,要求,之后检验是否为的原根。
由于,我们需要检验对于任意且,是否都满足。
优化:
由于如果,则
设。
只需要对每个验证是否满足,因为是除去分解后次幂中含有以外的所有约数的倍数。这样就相当于判掉了所有的约数。
三.指标
1.定义:设是模的一个原根,整数与互质,则存在唯一的整数满足:,称为以为底对模的一个指标。记为。
2.性质:
<1>
<2>
<3>
3.求指标:直接即可。
四.N次剩余问题(转自)
求解,p是质数。
先求出的最小原根,因为p是质数,因此必定存在与。
所求即变为。
用解出即可。
模板题
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a,K,mod,g,t,x,y,d;
vector<int>prime,ans;
inline int power(int x,int k,int mod)
{
int res=1;
while(k)
{
if(k&1)res=res*x%mod;
x=x*x%mod;k>>=1;
}
return res;
}
inline int find(int p)
{
int tmp=p-1;
for(int i=2;i*i<=tmp;i++)
{
if(tmp%i)continue;
prime.push_back(i);
while(tmp%i==0)tmp/=i;
}
if(tmp>1)prime.push_back(tmp);
for(int g=1;g<=p;g++)
{
bool flag=1;
for(unsigned int i=0;i<prime.size();i++)
if(power(g,(p-1)/prime[i],p)==1){flag=0;break;}
if(flag)return g;
}
return -1;
}
inline int BSGS(int a,int b,int mod)
{
if(b==1)return 0;
if(!a)return !b?1:-1;
map<int,int>mp;mp.clear();
int t=ceil(sqrt(mod));
for(int i=0,j=1;i<=t;i++,j=j*a%mod)mp[b*j%mod]=i;
a=power(a,t,mod);
for(int i=1,j=a;i<=t;i++,j=j*a%mod)if(mp.count(j))return i*t-mp[j];
return -1;
}
int exgcd(int a,int b,int &x,int &y)
{
if(!b){x=1,y=0;return a;}
int d=exgcd(b,a%b,x,y);
int z=x;x=y,y=z-(a/b)*y;
return d;
}
signed main()
{
scanf("%lld%lld%lld",&mod,&K,&a);
if(!a){puts("1");puts("0");return 0;}
g=find(mod);t=BSGS(g,a,mod);
//cerr<<"test::"<<g<<' '<<t<<endl;
d=exgcd(K,mod-1,x,y);
if(t%d){puts("0");return 0;}
int P=(mod-1)/d;
x=(x*(t/d)%P+P)%P;
while(x<mod)
{
ans.push_back(power(g,x,mod));
x+=P;
}
sort(ans.begin(),ans.end());
printf("%lld\n",ans.size());
for(int i=0;i<ans.size();i++)printf("%lld\n",ans[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现