一、实验内容
若p是奇素数,编程实现:
1、计算整数a模p的指数;
2、计算模p的原根整数g。
二、实验原理
1、设p>1是整数,a是与p互素的正整数。则使得a^e≡1(mod p)成立的最小正整数e叫做a对模m的指数。
2、①假设p是正整数,a是整数,如果a模p的阶等于φ( p ),则称a为模p的一个原根。
②求奇素数p的原根的方法:对p-1进行素因子分解,即p-1=(p1a1)(p2a2)…(pkak)。若恒有g(p-1/pi)≠1(mod p)成立,那么g就是p的原根。
3、①快速幂取余:积的取余等于取余的积的取余。
(因为遇到指数型的数据取模问题时,如果直接用int或者long long储存,就有可能会超出计算机整数的存取范围,而导致数据出错,使用快速幂方法可减小算法规模。)
三、代码
1、计算整数a模p的指数
#include<iostream>
#include<vector>
using namespace std;
long long fmode(long long a,long long b,long long m){
//a为底数,b为指数,m为模
long long sum=1;
a=a%m;
while(b>0){
//先判断是否是奇数,是奇数的话将多出来的数事先乘如sum
if(b%2==1) sum=(sum*a)%m;
b/=2;
a=(a*a)%m; //不断的两两合并再取模,减小a和b的规模
}
return sum;
}
int main(){
int a,p; //a为底数、p为模
vector<int>factor; //定义一个动态数组,存放素因子的值
cout<<"请输入底数a:";
cin>>a;
cout<<"请输入模p:";
cin>>p;
int fai=