求素数p的原根
定义: 设m>1,gcd(a,m)=1,使得成立的最小正整数d为a对模m的阶,记为δm(a)
如果δm(a)=φ(m),则称a是模m的原根
定理:设m>1,gcd(a,m)=1,那么正整数x是同于方程的一个根当且仅当δm(a) | x
定理:由欧拉定理得
gcd(a,n)=1
定理:模m有原根的充要条件是m=2,4,,其中p为奇质数,n为任意正整数
定理:素数必有原根,如果一个数n有原根那么他有φ(φ(n))个模n不同余的原根
求模素数p的原根的方法:对p-1素因子分解,即p-1=的标准分解式,若有
成立,
则a就是p的原根。(对于合数求原根,除了需要预先判断是否存在原根之外,还需要把p-1换成φ(p))
求素数的最小原根程序
const int maxn=;
int prime[maxn];
void Get_Prime(){
memset(prime,,sizeof(prime));
for(int i=;i<=maxn;i++){
if(!prime[i]) prime[++prime[]]=i;
for(int j=;j<=prime[]&&prime[j]<=maxn/i;j++){
prime[prime[j]*i]=;
if(i%prime[j]==) break;
}
}
//for(int i=1;i<=20;i++) cout<<prime[i]<<endl;
}
long long factor[][];
int fatCnt;
int GetFactors(long long x){
fatCnt=;
long long tmp=x;
for(int i=;prime[i]<=tmp/prime[i];i++){
factor[fatCnt][]=;
if(tmp%prime[i]==){
factor[fatCnt][]=prime[i];
while(tmp%prime[i]==){
factor[fatCnt][]++;
tmp/=prime[i];
}
fatCnt++;
}
}
if(tmp!=){
factor[fatCnt][]=tmp;
factor[fatCnt++][]=;
}
//for(int i=0;i<fatCnt;i++) cout<<"yinzi="<<factor[i][0]<<" mi="<<factor[i][1]<<endl;
return fatCnt;
}
template<class T> T fast_mod(T a,T b,T Mod){
a%=mod;
if(b==) return ;
T ans=,base=a;
while(b!=){
if(b&)ans=(ans*base)%Mod;
base=(base*base)%Mod;
b>>=;
}
return ans;
}
//判断一个数是否有原根
bool judge(int n){
if(n==||n==) return true;
GetFactors(n);
if(fatCnt==) return true;
if(fatCnt==&&factor[][]==&&factor[][]==) return true;
return false;
}
//返回最小的原根,如果没有则返回-1
int Solve(int P){
if(P==) return ;
//if(!judge(P)) return false;
GetFactors(P-);
for(int g=;g<P;g++){
bool flag=true;
for(int i=;i<fatCnt;i++){
int t=(P-)/factor[i][];
if(fast_mod(g,t,P)==) {
flag=false;break;
}
}
if(flag) return g;
}
}
求素数p的原根的更多相关文章
- 蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)
算法训练 Torry的困惑(基本型) 时间限制:1.0s 内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7……这样的数叫做质数.Torry突 ...
- python中用filter求素数
#用filter求素数 #生成器,生成一个无限序列 def _odd_iter(): n=1 while True: n=n+2 yield n #筛选函数 def _not_divisible(n) ...
- hdu 4548 筛法求素数 打表
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4548 Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题 ...
- PAT 07-3 求素数
求素数,这是一个“古老”的问题,每个学过编程的人都应该碰到过,这里是求第M+1到第N个素数,这么经典的问题,当然得给它写上一笔,下面是题设要求及代码实现 /* Name: Copyright: Aut ...
- UVA 10006 - Carmichael Numbers 数论(快速幂取模 + 筛法求素数)
Carmichael Numbers An important topic nowadays in computer science is cryptography. Some people e ...
- Facebook Hacker Cup 2015 Round 1--Homework(筛选法求素数)
题意:给定A,B,K(A<=B)三个数,问在[A,B]范围内的数素数因子个数为K的个数. 题解:典型的筛选法求素数.首先建立一个保存素数因子个数的数组factorNum[],以及到n为止含有素数 ...
- poj3006 筛选法求素数模板(数论)
POJ:3006 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. 筛选法求素数的大概思路是: 如果a这个数是一个质数,则n*a不是质数. 用一个数组实现就是 ...
- Java求素数时出现错误
Java求素数时出现错误 1.具体错误如下 No enclosing instance of type Prime is accessible. Must qualify the allocation ...
- 筛法求素数Java
输出:一个集合S,表示1~n以内所有的素数 import java.util.Scanner; public class 筛法求素数 { public static void main(String[ ...
随机推荐
- 自动化测试中,cookie的调用方法。
以cookie为例 方法一: 将返回的cookie写到setUp()中,每次执行用例之前就会调用一次. 如: class AA(unittest.TestCase): def setUp(self): ...
- lua学习之深入函数第二篇
深入函数 2 非全局的函数 函数是第一类值,函数可以存储到全局变量,局部变量,table 字段中 lua 函数库中的大部分函数存储到 table 字段中 Lib = {} Lib.foo = func ...
- 量化投资学习笔记27——《Python机器学习应用》课程笔记01
北京理工大学在线课程: http://www.icourse163.org/course/BIT-1001872001 机器学习分类 监督学习 无监督学习 半监督学习 强化学习 深度学习 Scikit ...
- C#XML文件操作随笔
以为公司一直没有电源屏厂家协议解析为DevVars相关的软件,手写费时费力还容易出错,用了2天时间做了一个.txt协议文件筛选加并解析成xml文件的工具,总结一下用到的几个知识点 1.LINQ 是一个 ...
- hadoop学习摘要
参考链接:https://www.zhihu.com/question/333417513 https://www.oschina.net/p/hbase hadoop环境搭建:https://blo ...
- 笔记本磁盘中OEM分区的使用
(1).开机进入系统前,按F8,进入Windows 10的高级启动选项,选择“修复计算机”. (2).选择键盘输入方法. (3).如果有管理员密码,需要输入:如果没有设置密码,直接“确定”即可. (4 ...
- 解决jQuery中input 失去焦点之后,不能再获取到焦点
//编辑过敏史 if(iToolbar == 'editGMS'){ lstype="gms"; var gms=""; if(gmstype=="0 ...
- 有多少人在面试时,被Java 如何线程间通讯,问哭了?
正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object. ...
- 1.python数据类型详解
python数据类型分类 1).数值型:整数型(int).浮点型(float).布尔型(bool 取值:True.False) 2).容器类型 : 字符串型(str).列表(list).元祖(tupl ...
- jQuery---offset方法和position方法
offset方法和position方法 获取元素的相对于document的位置 //获取元素的相对于document的位置 $(".son").offset(); console. ...