【信安数学基础】求奇素数p的原根和整数a模p的指数

这篇博客介绍了如何在C++中编程实现计算整数a模奇素数p的指数以及寻找模p的原根。实验原理包括a对模m的指数定义以及求原根的方法,通过素因子分解判断是否为原根。同时,博主分享了使用快速幂取余算法来避免因指数过大导致的数据溢出问题。最后,提供了计算指数和原根的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验内容

若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=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值