求最小正整数x,A^x=1(mod M)求阶模板
整数的阶:设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)求阶模板的更多相关文章
- hiho 第116周,最大流最小割定理,求最小割集S,T
小Hi:在上一周的Hiho一下中我们初步讲解了网络流的概念以及常规解法,小Ho你还记得内容么? 小Ho:我记得!网络流就是给定了一张图G=(V,E),以及源点s和汇点t.每一条边e(u,v)具有容量c ...
- Assignment HDU - 2853(求最小改变边数)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- [hdu5251]矩形面积 旋转卡壳求最小矩形覆盖
旋转卡壳求最小矩形覆盖的模板题. 因为最小矩形必定与凸包的一条边平行,则枚举凸包的边,通过旋转卡壳的思想去找到其他3个点,构成矩形,求出最小面积即可. #include<cstdio> # ...
- SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小连续数组中的最大值
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- 找出数组中从未出现的最小正整数java实现
/** * 找出未出现的最小正整数 * @param A * @param n * @date 2016-10-7 * @author shaobn */ public static int find ...
- poj 3469 Dual Core CPU【求最小割容量】
Dual Core CPU Time Limit: 15000MS Memory Limit: 131072K Total Submissions: 21453 Accepted: 9297 ...
- BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ...
- The Minimum Length - HUST 1010(求最小循环节)
题意:有个一字符串A(本身不是循环串),然后经过很多次自增变成AAAAA,然后呢从自增串里面切出来一部分串B,用这个串B求出来A的长度. 分析:其实就是求最小循环节.......串的长度 - 最大 ...
- [KMP求最小循环节][HDU1358][Period]
题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...
随机推荐
- nginx,wsgi,django的关系
http://blog.csdn.net/lihao21/article/details/52304119 wsgi用于连续 nginx和django,客户端发来的请求,先经过wsgi,然后再传给dj ...
- 一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发
六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? OutputStreamWriter ou ...
- 今天终于看了一下tanh函数的形式,双曲正切函数
tanh = sinh / cosh sinh = Hyperbolic sin cosh = Hyperbolic cos
- django网站安全学习记录
现在比较流行的网站攻击方式有sql注入,xss跨站脚本攻击,csrf跨站请求伪造,一句话木马等等 django非常强大,对这些攻击都做了防范 sql注入,通过在sql语句中插入非法的sql语句来实现爆 ...
- ES6中的Map集合(与java里类似)
Set类型可以用来处理列表中的值,但是不适用于处理键值对这样的信息结构.ES6也添加了Map集合来解决类似的问题 一.Map集合 JS的对象(Object),本质上是键值对的集合(Hash结构),但是 ...
- account for 与led to和result in的区别
account for sth:be the explanation of sth; explain the cause of sth 作某事物的解释; 解释某事物的原因:His illness ac ...
- mac 上python编译报错No module named MySQLdb
mac 上python编译报错No module named MySQLdb You installed python You did brew install mysql You did expor ...
- 通过脚本发送zabbix微信报警
实现zabbix通过微信报警的方式也是通过脚本来实现,与邮件报警不同的是,脚本调用的微信的相关接口的获取相对复杂一点 1.申请一个微信公众号(企业号) 申请方法不多说,如果已申请请忽略 2.在微信企业 ...
- smarty在循环的时候计数来显示这是第几次循环的功能
想必有很多人比较喜欢这个smarty循环的时候有个变量增加的功能或比较需要这个功能吧?其实不需要额外的变量,当然你也许根本用不了.我们用smarty内置的就可以了.就是smarty有foreach和s ...
- 使用uncompyle2直接反编译python字节码文件pyo/pyc
update:在Mac OS X版的September 10, 2014版(5.0.9-1)中发现安装目录中的src.zip已更换位置至WingIDE.app/Contents/Resources/b ...