阶 原根 离散对数
阶 原根 离散对数
阶
定义
符号语言:
根据这个表格,我们可以举出一些例子
原根
定义
满足上述则
最小原根
我们枚举,如果
找出一个可能是原根的数,我们从
如果全都不同余
while(++g){
int now=1,bj=0;
if(gcd(g,n)!=1) continue;
for(int j=1;j<phi[n];j++){
now=now*g%n;
if(now==1){
bj=1;
break;
}
}
if(bj==1) continue;
else if(bj==0){
break;
}
}
找出其他原根
我们认为
寻找方法:
我们考虑当
的时候 会同余
代码
int now=g;
ans[++cnt]=g;
for(int j=2;j<phi[n];j++){
now=now*g%n;
if(gcd(j,phi[n])!=1) continue;
ans[++cnt]=now;
}
有无原根
这些数有原根
证明详见
原根数量
我们在前面可以知道,当求出一个g(最小原根),
有多少个
其实就是
总代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int phi[N],prim[N],v[N],vis[N],tot=0,ans[N],cnt=0;
int t,n,d;
void pre(){
phi[1]=1;
for(int i=2;i<=N-1;i++){
if(!v[i]){
prim[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot&&prim[j]*i<=N-10;j++){
v[i*prim[j]]=1;
if(i%prim[j]==0){
phi[i*prim[j]]=phi[i]*prim[j];
break;
}else{
phi[i*prim[j]]=phi[i]*phi[prim[j]];
}
}
}
vis[2]=1;
vis[4]=1;
for(int i=2;i<=tot;i++){
for(long long j=1;j<=N;j=j*prim[i]){
if(j>N-10){
break;
}
vis[j]=1;
if(2*j<=N-1) vis[2*j]=1;
}
}
}//预处理phi和prime
int gcd(int x,int y){
if(y==0) return x;
return gcd(y,x%y);
}
void input(){
scanf("%d",&t);
for(int i=1;i<=t;i++){
cnt=0;
memset(ans,0,sizeof(ans));
scanf("%d%d",&n,&d);
if(!vis[n]){
printf("0\n\n");
continue;
}
int g=0;
while(++g){
int now=1,bj=0;
if(gcd(g,n)!=1) continue;
for(int j=1;j<phi[n];j++){
now=now*g%n;
if(now==1){
bj=1;
break;
}
}
if(bj==1) continue;
else if(bj==0){
break;
}
}
int now=g;
ans[++cnt]=g;
for(int j=2;j<phi[n];j++){
now=now*g%n;
if(gcd(j,phi[n])!=1) continue;
ans[++cnt]=now;
}
sort(ans+1,ans+1+cnt);
printf("%d\n",phi[phi[n]]);
for(int j=1;j<=phi[phi[n]]/d;j++){
printf("%d ",ans[j*d]);
}
printf("\n");
}
}
int main(){
// freopen("1.txt","w",stdout);
pre();
input();
return 0;
}
离散对数
就是对数的定义,只不过在模意义下
定义
对于正整数
性质
1.当
2.当
利用离散对数可以将模
意义下的 转化为
BSGS
题目描述:
已知
根据性质1,在
我们枚举
我们考虑更优秀的枚举:
可以发现现在依旧
转换一下
发现现在只有两个未知数A,B我们可以先枚举一次B预处理
用map记录所有
再枚举A算出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现