美文网首页信息安全专业知识
简明信息安全数学基础第二章

简明信息安全数学基础第二章

作者: 简言之_ | 来源:发表于2019-03-17 10:13 被阅读415次

一,判断题

5,×
10,√
15,×
20,√
25,√
30,×
35,×

二,单选题

5.D
10.D
15.B
27.B

四,综合题

a1≡b1 (mod m),a2≡b2 (mod m)
a1+a2≡b1+b2 (mod m)
∴a1+a2+...+ak≡b1+b2+...+bk (mod m)
a1≡b1 (mod m),a2≡b2 (mod m)
a1*a2≡b1*b2 (mod m)
∴a1*a2*...*ak≡b1*b2*...*bk (mod m)
(1)2^32 (mod47)
2^32=2^32
2^1≡2 (mod47)
2^2≡4 (mod47)
2^4≡16 (mod47)
2^8≡16^2≡21 (mod47)
2^16≡21^2≡18 (mod47)
2^32≡18^2≡42 (mod47)
∴2^32≡42 (mod47)

(2)2^47(mod47)
2^46≡1(mod 47)
2^47≡2^46*2≡1*2(mod 47)

2^47=2^32*2^8*2^4*2^2*2
2^32=2^32
2^1≡2 (mod47)
2^2≡4 (mod47)
2^4≡16 (mod47)
2^8≡16^2≡21 (mod47)
2^16≡21^2≡18 (mod47)
2^32≡18^2≡42 (mod47)
2^47≡42*21*16*4*2≡2(mod47)
∴2^47≡2(mod47)

(3)2^200(mod47)
∵2^46≡1 (mod 47)
200=46*4+16
2^200=2^(46*4)*2^16
2^200≡1^4*2^16(mod47)
2^16≡18(mod47)
(1)1843581
1+8+4+3+5+8+1=30
3|30,9不整除30
∴3整除1843581

(2)184234081
1+8+4+2+3+4+0+8+1=31
3和9都不整除31
∴3和9都不整除184234081

(3)8937752744
8+9+3+7+7+5+2+7+4+4=56
3|56,9|56
∴3和9都不能整除8937752744

(4)4153768912246
4+1+5+3+7+6+8+9+1+2+2+4+6=58
3|58,9|58
∴3和9都不能整除4153768912246

编程题

1.编程输出n的Euler函数值φ(n)

image.png
#include<iostream>
#include<cmath>
using namespace std;
int euler(int n)
{    
    int ans=n;    
    for(int i=2;i<=sqrt(n);i++)//2~ √n 求素因子 
    {  
        if(n%i==0)// 求素因子
        {  
        ans=ans/i*(i-1); ///通项公式求解欧拉函数值 
        while(n%i==0) // 每个素因子只计算一次
        n/=i;  
        }  
    }  
       if(n>1) ans=ans/n*(n-1);  //当n为素数时 
       return ans;  
 } 
int main()
{
  int n;
    while(cin>>n)///测试
    {
        cout<<euler(n)<<endl;
    }
    return 0;
} 

2.编程实现模重复平方运算(求b^n (mod m))

image.png

方法一:非递归(模幂算法)

#include<iostream>
#include<cmath>
using namespace std;
int euler(int n)//求n的欧拉值 
{    
    int ans=n;    
    for(int i=2;i<=sqrt(n);i++)//2~ √n 求素因子 
    {  
        if(n%i==0)// 求素因子
        {  
        ans=ans/i*(i-1); ///通项公式求解欧拉函数值 
        while(n%i==0) // 每个素因子只计算一次
        n/=i;  
        }  
    }  
       if(n>1) ans=ans/n*(n-1);  //当n为素数时 
       return ans;  
 } 
int powerMod(int b,int n,int m){//模平方算法 
    int r;
    r=n%euler(m);   
    n=r;
    int a=1;//存放计算结果,初始化为1
    int i,k=0,num=n;
    while(num){//计算指数二进制位数k 
        num=num>>1;//将num右移1位(也即除以2),然后再将结果赋值给num.等同 num=num/2;
        ++k;//num的二进制右移一位 
    }
     for(i=0;i<k;i++){
        if((n>>i)&1)//取二进制的第i位,然后和1进行与运算(判断i位是否为1) 
          {a=a*b%m;}//二进制位为1时操作 
           b=b*b%m;// 二进制位为1和0时操作 
     }
    return a;
}

int main(){
    int b,n,m;  
    cout<<"请分别输入底数b,指数n,模m:";
    cin>>b>>n>>m;
    cout<<"b^n(mod m)="<<powerMod(b,n,m);
    return 0;
} 
image.png

方法二:递归

递归公式: b^n(mod m)=b* (b^(n-1) (mod m)) (mod m)

#include<iostream>
using namespace std;
int powerMod(int b,int n,int m){ //递归公式: b^n(mod m)=b* (b^(n-1) (mod m)) (mod m)
    if(0==n)
    return 1;
    return b*powerMod(b,n-1,m)%m;
}

int main(){
    int b,n,m;
    cout<<"请分别输入底数b,指数n,模m:";
    cin>>b>>n>>m;
    cout<<"b^n(mod m)="<<powerMod(b,n,m);
    return 0;
} 
image.png

相关文章

网友评论

    本文标题:简明信息安全数学基础第二章

    本文链接:https://www.haomeiwen.com/subject/vhpfmqtx.html