整数的阶:设a和n是互素的正整数,使得a^x=1(mod n)成立的最小的正整数x称为a模n的阶

//求阶模板:A^x=1(mod M),调用GetJie(A,M)
//输入:10^10>A,M>1
//输出:无解返回-1,有解返回最小正整数x
//复杂度:O(M^(0.5))
long long gcd(long long a,long long b)
{
if(b==) return a;
return gcd(b,a%b);
} //欧拉函数:复杂度O(n^(0.5)),返回[1,n-1]中所有和n互素的数的个数和
long long phi(long long x)
{
long long sum=x;
for(long long i=;i*i<=x;i++)
{
if(x%i==)
{
sum=sum-sum/i;
while(x%i==) x/=i;
}
}
if(x!=) sum=sum-sum/x;
return sum;
} long long Mod_Mul(long long a,long long b,long long mod)
{
long long sum=;
while(b)
{
if(b&) sum=(sum+a)%mod;
b>>=;
a = (a+a)%mod;
}
return sum;
} //a^b%mod 快速幂
long long Quk_Mul(long long a,long long b,long long mod)
{
long long qsum=;
while(b)
{
if(b&) qsum=Mod_Mul(qsum,a,mod);
b>>=;
a=Mod_Mul(a, a, mod);
}
return qsum;
} long long GetJie(long long A,long long M)
{
long long d = gcd(A,M);
if(d != ) return -;
long long m=phi(M);
//然后对m进行拆分
long long prm[],prmcnt[];
int pcnt=;
memset(prmcnt,,sizeof(prmcnt));
long long tm = m;
for(long long i=;i*i<=tm;i++)
{
if(tm%i==)
{
prm[pcnt]=i;
while(tm%i==)
{
prmcnt[pcnt]++;
tm/=i;
}
pcnt++;
}
}
if(tm!=)
{
prm[pcnt]=tm;
prmcnt[pcnt]=;
pcnt++;
}
for(int i=;i<pcnt;i++)
{
for(int j=;j<prmcnt[i];j++)
{
if( Quk_Mul(A, m/prm[i], M)== )
{
m/=prm[i];
}
}
}
return m;
}

//再加一个打素数表的。理论上会快10倍。

//求阶模板:A^x=1(mod M),调用GetJie(A,M)
//输入:10^10>A,M>1
//输出:无解返回-1,有解返回最小正整数x
//复杂度:M^(0.5) long long PRIME[]; long long gcd(long long a,long long b)
{
if(b==) return a;
return gcd(b,a%b);
} //欧拉函数:复杂度O(n^(0.5)),返回[1,n-1]中所有和n互素的数的个数和
long long phi(long long x)
{
long long sum=x;
long long p = PRIME[];
for(int i=;p*p<=x;i++)
{
if( == x%p)
{
sum=sum-sum/p;
while(x%p==) x/=p;
}
p=PRIME[i+];
}
if(x!=) sum=sum-sum/x;
return sum;
} long long Mod_Mul(long long a,long long b,long long mod)
{
long long sum=;
while(b)
{
if(b&) sum=(sum+a)%mod;
b>>=;
a = (a+a)%mod;
}
return sum;
} //a^b%mod 快速幂
long long Quk_Mul(long long a,long long b,long long mod)
{
long long qsum=;
while(b)
{
if(b&) qsum=Mod_Mul(qsum,a,mod);//mod不是很大的时候这一步可以去掉
b>>=;
a=Mod_Mul(a, a, mod);//
}
return qsum;
} long long GetJie(long long A,long long M)
{
long long d = gcd(A,M);
if(d != ) return -;
long long m=phi(M);
//然后对m进行拆分
long long prm[],prmcnt[];
int pcnt=;
memset(prmcnt,,sizeof(prmcnt));
long long tm = m;
long long p=PRIME[];
for(long long i=;p*p<=tm;i++)
{
if(tm%p==)
{
prm[pcnt]=p;
while(tm%p==)
{
prmcnt[pcnt]++;
tm/=p;
}
pcnt++;
}
p=PRIME[i+];
}
if(tm!=)
{
prm[pcnt]=tm;
prmcnt[pcnt]=;
pcnt++;
}
for(int i=;i<pcnt;i++)
{
for(int j=;j<prmcnt[i];j++)
{
if( Quk_Mul(A, m/prm[i], M)== )
{
m/=prm[i];
}
}
}
return m;
} void getprime(long long up)
{
bool pmark[];
memset(pmark,,sizeof(pmark));
int pcnt=;
PRIME[pcnt++]=;
for(int i=;i<=up;i+=) pmark[i]=;
for(int i=;i<=up;i+=)
{
if(pmark[i]==)
{
PRIME[ pcnt++ ] = i;
for(int j=i+i;j<=up;j+=i)
{
pmark[j]=;
}
}
}
}

求最小正整数x,A^x=1(mod M)求阶模板的更多相关文章

  1. hiho 第116周,最大流最小割定理,求最小割集S,T

    小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c ...

  2. Assignment HDU - 2853(求最小改变边数)

    Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. [hdu5251]矩形面积 旋转卡壳求最小矩形覆盖

    旋转卡壳求最小矩形覆盖的模板题. 因为最小矩形必定与凸包的一条边平行,则枚举凸包的边,通过旋转卡壳的思想去找到其他3个点,构成矩形,求出最小面积即可. #include<cstdio> # ...

  4. SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小连续数组中的最大值

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  5. 找出数组中从未出现的最小正整数java实现

    /** * 找出未出现的最小正整数 * @param A * @param n * @date 2016-10-7 * @author shaobn */ public static int find ...

  6. poj 3469 Dual Core CPU【求最小割容量】

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 21453   Accepted: 9297 ...

  7. BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   ...

  8. The Minimum Length - HUST 1010(求最小循环节)

    题意:有个一字符串A(本身不是循环串),然后经过很多次自增变成AAAAA,然后呢从自增串里面切出来一部分串B,用这个串B求出来A的长度.   分析:其实就是求最小循环节.......串的长度 - 最大 ...

  9. [KMP求最小循环节][HDU1358][Period]

    题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...

随机推荐

  1. zookeeper启动错误 ---- Unable to load database on disk

    zk启动报错 解决办法,进入zkdata目录删除version-2下面的所有文件 参考: https://issues.apache.org/jira/browse/ZOOKEEPER-1546 [h ...

  2. 批量删除Redis中的key

    bin/redis-cli -h 192.168.46.151 -p 6379 keys "rulelist*" | xargs bin/redis-cli  -h 192.168 ...

  3. 百度地图 Android SDK - 标注(Marker)的基本使用

    标注(Marker)是开发人员最常使用的地图覆盖物志一.今天就来向大家介绍一些标注(Marker)的最基本用法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处加入 Marker: 3.实现 ...

  4. Centos 通过yum的方式升级内核

    在安装某些软件时,可能对我们的系统内核版本有要求. 比如在安装docker要满足一定的条件,对于centos系统,要求必须是64位,并且内核版本是3.10以上. 如果你的centos操作系统内核低于3 ...

  5. Win7旗舰版+IIS7没有错误提示怎么办

    在IIS Manger中将ASP的调试属性修改默认值,启用服务端调试和客户端调试都改为True,重启后生效.

  6. Efficiently traversing InnoDB B+Trees with the page directory--slot

    Efficientlytraversing InnoDB B+Trees with the page directory 1.the purpose of the page directory As ...

  7. ListView:聊天界面

    一.最终成型图 二.主界面xml布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  8. 标准库Queue的实现

    跟上篇实现stack的思路一致,我增加了一些成员函数模板,支持不同类型的Queue之间的复制和赋值. 同时提供一个异常类. 代码如下: #ifndef QUEUE_HPP #define QUEUE_ ...

  9. datatables插件适用示例

    本文共四部分:官网 | 基本使用|遇到的问题|属性表 一:官方网站:[http://www.datatables.NET/] 二:基本使用:[http://www.guoxk.com/node/jQu ...

  10. linux路由服务

    本文介绍怎样使用linux创建一台简单的路由server. 主要包含几个參数的设置:ip_forward和rp_filter. 1.开启IP forwarding # 重新启动后失效 $ echo & ...