整数的阶:设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. docer中运行crontab

    1  安装 sudo apt-get install cron 2 启动 start cron 3  列出所有本机启动crontab任务 ls -l /etc/init.d 列出所有自建cron任务 ...

  2. selenium firefox设置代理

    from selenium import webdriver profile = webdriver.FirefoxProfile() profile.set_preference('network. ...

  3. pc_lint的用法转

    PC-Lint是一款C/C++软件代码静态分析工具,不仅可以检查一般的语法错误,还可以检查潜在的错误,比如数组访问越界.内存泄漏.使用未初始化变量.使用空指针等.在单元测试前使用PC-Lint来检查代 ...

  4. Linux alias理解及设置

    1.alias简介 Linux alias 是命令的一种别称,输入 alias 可以看到像下面这样的结果: alias l.='ls -d .* --color=auto' alias ll='ls ...

  5. java根据身份证号和获取用户年龄和性别的工具类

    import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util ...

  6. 倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 24.0怎么办

    24.0 位置偏差过大保护   读取驱动器参数之后,在基本的014项目把设定值设置为最大,然后点击传送,EEP写入驱动器后重启驱动器即可     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空 ...

  7. MPTCP 理解

    背景      随着技术的发展许多设备具有了多个网络接口,而TCP依然是一个单线路的协议,在TCP的通信过程中发端和收端都 不能随意变换地址.我们可以利用多个网络接口的这一特性来改善性能和有效冗余.例 ...

  8. Time.timeScale 时间缩放

    static var timeScale : float Description描述 The scale at which the time is passing. This can be used ...

  9. Spark on Intellij IDEA

    添加scala插件 如果网络有问题,可以手动下载插件安装包(http://plugins.jetbrains.com/plugin/?id=1347),在上面选择“Install plugin fro ...

  10. LinkedHashMap的实现讲解

    http://www.cnblogs.com/hubingxu/archive/2012/02/21/2361281.html LinkedHashMap 是HashMap的一个子类,保存了记录的插入 ...