信息安全数学基础编程题作业,代码不够精简仅供参考
提示:以下是本篇文章正文内容,下面案例可供参考
一、求逆元
问题描述:写出判断a在模m下是否有逆元,如果有求出逆元的程序。
思路:若(a,m)=1,则a在模m下是有逆元b,b在大于等于1小于m这个区间内,使得a*b1(mod m),即(a*b-1)%m=0。
(用广义欧几里得除法求最大公因数)
代码展示:
#include<iostream>
using namespace std;
int main()
{
int a=0,m=0;
cin>>a>>m;
int temp=a,mt=m,d=0,temp2;
while(d!=1)//求a,m的最大公因数
{
if(temp%mt==0)
{
d=mt;
break;
}
else
{
temp2=temp;
temp=mt;
mt=temp2%mt;
}
}
if(d==1)//存在逆元
{
for(int i=1;i<m;i++)
{
if((a*i-1)%m==0)
{
cout<<i;
break;
}
}
}
else cout<<"a不存在它的逆元";
}
结果:
二、求欧拉函数值
问题描述:写出求n的欧拉函数值的程序。
思路:只要将n写成素数相乘的形式,即,
代码展示:
#include<iostream>
#include<cmath>//sqrt(n)
using namespace std;
int main(){
int n;
cin>>n;//输入要大于等于2
int i=0,m=sqrt(n);//数组存储小于等于根号n的所有素数
int count=1; //欧拉函数值
int arr[m];
arr[0]=2;//最小素数
int panduan;
for( int k=3; k<=m;k++){ //素数
panduan=1;
for(int j=0;j<=i;j++){
if(k%arr[j]==0)
{
panduan=0;
break;
} }
if(panduan==1){
i++;
arr[i]=k;
} }
arr[++i]=n;//考虑n本身是素数
for(int j=0;j<=i&&n>=arr[j];j++)//注意j不要超过数组的实际大小
{
if(n%arr[j]==0)
{
n=n/arr[j];
count*=(arr[j]-1);
while(n%arr[j]==0)
{
n=n/arr[j];
count*=arr[j];
} } }
cout<<count;
}
结果: