zoukankan      html  css  js  c++  java
  • 密码数学大作业

    Answer sheet of Mathematics for Cryptography

    Class date November 16-27, 2019
    Signature
    Exam given by Prof. Z¨ulf¨ukar SAYGI
    1 2 3 4 5 6 7 8 9 10 Total

    Instructions

    • As this is an exam, you are supposed to complete the problems by yourself.
    • You can use all kind of materials and you are welcome to ask me questions.
    • The deadline is Wednesday 10 am (November 27).
    • Show all your work to get complete score.
    • Please send your exam paper by an email to sor give it directly to me
      at the end of the class.
    • Good Luck...

    Questions and Answers

    1. Use the Euclidean algorithm to find the greatest common divisor of 2613 and 2171.

    [gcd(a,b)=gcd(b,a\%b) ]

    Code for solving the greatest common factor 1

    int gcd(int a,int b)//Recursive
    {
         return b==0?a:gcd(b,a%b);
    }
    

    Code for solving the greatest common factor 2

    int gcd(int a,int b) //Euclidean algorithm
    {					//cycle
        int t=a%b;
        while(t!=0) 
        {
            a=b;
            b=t;
            t=a%b;
        }
        return b;
    }
    

    Full version of the code to solve the greatest common factor

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int gcd(int a,int b);
    int gcd(int a,int b) //Euclidean algorithm
    {
        int t=a%b;
        while(t!=0) 
        {
            a=b;
            b=t;
            t=a%b;
        }
        return b;
    }
    
    int main(){
        int m, n;
        scanf("%d %d", &m, &n);
        int gcd_m_n;
        gcd_m_n = gcd(m, n);
        printf("The greatest common divisor of %d and %d is %d", m, n, gcd_m_n);
        getchar();
        return 0;
    }
    

    The greatest common divisor of 2613 and 2171 is 13.

    2.Use the extended Euclidean algorithm to find integers (x) and (y) satisfying that

    [gcd(2613; 2171) = x · 2613 + y · 2171: ]

    inline void exgcd(int a,int b)
    {
        if (b)
            {
                exgcd(b,a%b);
                int k=x;
                x=y;
                y=k-a/b*y;
            }
        else y=(x=1)-1;
    }
    
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int x, y;
    inline void exgcd(int a,int b)
    {
        if (b)
            {
                exgcd(b,a%b);
                int k=x;
                x=y;
                y=k-a/b*y;
            }
        else y=(x=1)-1;
    }
    int main(){
        int m, n;
        scanf("%d %d", &m, &n);
    	exgcd(m, n);
        printf("gcd(a,b)=ax+by, a= %d, b= %d, x= %d, y=%d", m, n, x, y);
        getchar();
        return 0;
    }
    

    (gcd(a,b)=ax+by, a= 2613, b= 2171, x= -54, y=65.)

    3. Is there any integers (x) and (y) satisfying the equation (1 = x · 14651 + y · 30758)

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int x, y;
    int gcd(int a,int b);
    int gcd(int a,int b) //Euclidean algorithm
    {
        int t=a%b;
        while(t!=0) 
        {
            a=b;
            b=t;
            t=a%b;
        }
        return b;
    }
    
    inline void exgcd(int a,int b)
    {
        if (b)
            {
                exgcd(b,a%b);
                int k=x;
                x=y;
                y=k-a/b*y;
            }
        else y=(x=1)-1;
    }
    int main(){
        int a, b, c;
        cin>>a>>b>>c;
        int r = gcd(a,b);
        if( c%r != 0){
            printf("No integer solution.");
            return 0;
        }
    	exgcd(a, b);
        x = x*c/r;
        y = y*c/r;// x=x1+b/r*t , y=y1-a/r*t , t is an integer.
        cout<<"General solution:"<<x<<"+"<<b/r<<"*t;"<<"  "<<y<<"-"<<a/r<<"*t"<<" t is an integer."
        getchar();
        return 0;
    }
    

    No integer solution.

    4. Determine all integers x such that

    [x ≡ 1 mod 121\ x ≡ 2 mod 144\ x ≡ 3 mod 169 ]

    Easily accessible from the procedure in question 1. 121 144 169 Prime to each other can use Chinese Remainder Theorem.

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    using namespace std;
    int a1,a2,a3,b1,b2,b3;
    int m;
    int exgcd(int a,int b,int &x,int &y){
        if(!b){
            x=1;y=0;
            return a;
        }
        int t=exgcd(b,a%b,y,x);
        y-=a/b*x;
        return t;
    }
    int inv(int a,int b){//Solving Inverse Elements
        int x=0,y=0;
        int t=exgcd(a,b,x,y);
        if(t!=1) return -1;
        else return((x+b)%b);
    }
    int main(){
        cin>>a1>>b1>>a2>>b2>>a3>>b3;//a 是'mod'字符后的数字,是121 144 169 b是 'mod'字符前的数字 是1 2 3 
        m=a1*a2*a3;
        int x_min = (m/a1*inv(m/a1,a1)*b1+m/a2*inv(m/a2,a2)*b2+m/a3*inv(m/a3,a3)*b3)%m;
        cout<<"The above algorithm can find the smallest integer solution x is "<<x_min<<"."<<endl;
    	cout<<"General solutions x are "<<x_min<<" + z * "<<m<<".";
    	getchar(); 
        return 0;
    }
    

    The above algorithm can find the smallest integer solution x is 368930.

    General solutions are (368930+z*2944656) z is an integer.

    5. Compute (2^{1000000} mod 11) by using Fermat’s Little Theorem.

    Fermat’s Little Theorem. :

    ​ If (p) is a prime and (gcd(a, p) = 1), then (a^{p-1} ≡ 1 mod p).

    (11) is a prime and (gcd(2,11) = 1), then (2^{11-1}=2^{10} ≡ 1 mod 11).
    (11) is a prime and (gcd(2^{10} ,11) = 1), then (2^{10*(11-1)}=2^{100} ≡ 1 mod 11).
    (11) is a prime and (gcd(2^{100} ,11) = 1), then (2^{100*(11-1)}=2^{1000} ≡ 1 mod 11).
    (11) is a prime and (gcd(2^{1000} ,11) = 1), then (2^{1000*(11-1)}=2^{10000} ≡ 1 mod 11).
    (11) is a prime and (gcd(2^{10000} ,11) = 1), then (2^{10000*(11-1)}=2^{100000} ≡ 1 mod 11).
    (11) is a prime and (gcd(2^{100000} ,11) = 1), then (2^{100000*(11-1)}=2^{1000000} ≡ 1 mod 11).
    (2^{1000000} mod 11=1)

    6. Compute (2^{1000000} mod 77) by using Euler’s Theorem.

    $77=7*11,7 and 11 $ are prime.​

    (phi(77)=phi(7)*phi(11)=60)

    (ecause) Euler’s Theorem:

    (gcd(a,m)=1)(Rightarrow) (a^{phi(m)}≡1 mod m)
    (Rightarrow) (a^x≡a^{x \% phi(m)} mod m)

    ( herefore)(2^{1000000} ≡ 2^{1000000 \% 60=40} mod 77)

    ( herefore) (2^{1000000} mod 77=2^{40})

    7. Compute (2^{1000000} mod 154) by using Chinese Remainder Theorem.

    Least common multiple 2, 7, 11

    (154=2*7*11)

    (2^{1000000} mod 154=100)

    8. Find $5^{1234}mod 1453 $ using square-and-multiply algorithm.

    typedef long long ll;
    ll mod;
    ll qpow(ll a, ll n)//a^n % mod
    {
        ll re = 1;
        while(n)
        {
            if(n & 1)
                re = (re * a) % mod;
            n >>= 1;
            a = (a * a) % mod;
        }
        return re % mod;
    }
    
    #include<iostream>
    using namespace std;
    typedef long long ll;
    ll mod;
    ll qpow(ll a, ll n)// a^n % mod
    {
        ll re = 1;
        while(n)
        {
            if(n & 1)//Determine if the last bit of n is 1
                re = (re * a) % mod;
            n >>= 1;
            a = (a * a) % mod;
        }
        return re % mod;
    }
    int main(){
    	int a, n;
    	cin>>a>>n>>mod;
    	cout<<qpow(a,n);
    	getchar();
    	return 0;
    }
    

    (5^{1234}mod 1453 = 1342)

    9. Find the complete factorization of (x^9 - x in mathbb{F} _3[x]).

    (x^9 - x =x(x+1)(x-1)(x^2+1)(x^4+1))

    10. Find an irreducible polynomial and construct the finite field having 25 elements.

  • 相关阅读:
    worldWind发布1.3.2版本了
    XMLSerializer中数组对象的设定
    IE6+UTF8的一个怪异问题
    恢复ServU管理员密码方法
    asp.net中的窗体身份验证(不同的角色访问不同的目录)
    什么是 Landing Page?
    如何让排名更加稳定
    JS替换空格回车换行符
    外部调用ZBLOG文章的方法
    表单填写字母时大小写自动互转(CSS方式)
  • 原文地址:https://www.cnblogs.com/lingr7/p/11941610.html
Copyright © 2011-2022 走看看