互质

2017-10-20 42 views
-1

我想创造我afinne代码的互质:互质

static void Main(string[] args) 
     { 
      string input = ""; 
      string openMessage = ""; 
      openMessage = openMessage.ToUpper(); 
      string cryptedMessage = ""; 
      int a; 
      int b; 
      int m; 

      Console.WriteLine("Enter the modular size of the alphabet:"); 
      input = Console.ReadLine(); 
      m = int.Parse(input); 

      Console.WriteLine("Enter first value for encrypting the message:"); 
      input = Console.ReadLine(); 
      a = int.Parse(input); 
      while(a!=0 && m !=0) 
      { 
       if (a > m) 
       { 
        a %= m; 
       } else 
       { 
        m %= a; 
       } 

      } 
      Console.WriteLine("Enter second value for encrypting the message:"); 
      input = Console.ReadLine(); 
      b = int.Parse(input); 

      Console.WriteLine("Enter the message you want to encrypt:"); 
      input = Console.ReadLine(); 
      openMessage = input.ToUpper(); 

      foreach (char letter in openMessage) 
      { 
       int letterNumber = (int)letter; 
       letterNumber = (a * (letterNumber - 65) + b) % m; //Afinne Cipher math 
       letterNumber = letterNumber + 65; 
       char encryptedLetter = (char)letterNumber; 
       cryptedMessage = cryptedMessage + encryptedLetter; 
      } 
      Console.WriteLine(cryptedMessage); 

     } 

有没有人有一个建议,如何做到这一点?

我想比较int mint a。我抬头看谷歌,发现this,但看起来很难实现我的代码。

+1

GCD的欧几里得算法很容易实现。你为什么觉得很难? –

+0

因为我仍然是编码初学者 –

+0

https://rosettacode.org/wiki/Greatest_common_divisor –

回答

1

用于确定两个非负整数的greatest common divisoreuclidean algorithm可以在C#中实现,如下所示。

public int Gcd(int m, int n) 
{ 
    var tmp = 0; 
    if (m < n) 
    { 
     tmp = m; 
     m = n; 
     n = tmp; 
    } 
    while (n != 0) 
    { 
     tmp = m % n; 
     m = n; 
     n = tmp; 
    } 
    return m; 
} 

基于此实施方式中,一小部分m/n可以用下面的函数降低。

public void Reduce(ref int m, ref int n) 
{ 
    var Gcd = Gcd(m, n); 
    m /= Gcd; 
    n /= Gcd; 
} 
+0

我发现也BigInteger.ModPow();.欧几里得算法更好吗? –