110,533
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int m = 79;
int e = 51;
int n = 90;
Console.WriteLine("Result = " + ExpMod(m, e, n));
Console.ReadLine();
}
public static int ExpMod(int m, int e, int n) // ((m^e) mod n)
{
List<bool> split = SplitExp(e);
if (split.Count == 0)
{
return 1;
}
int result = -1;
int mod = 1;
for (int i = 0, j=0; i < split.Count; i++, j++)
{
if (j == 0)
{
mod = Mod(m, n);
}
else
{
mod = MultiMod(mod, mod, n); // (m^(2^j)) mod n
}
Console.WriteLine(string.Format("({0}^(2^{1})) mod {2} = {3}", m, j, n, mod));
if (split[i])
{
if (result == -1)
{
result = mod;
}
else
{
result = MultiMod(result, mod, n);
}
}
//Console.WriteLine("by now, result is " + result);
}
return result;
}
private static List<bool> SplitExp(int e)
{
if (e <= 0)
{
return new List<bool>();
}
List<bool> bits = new List<bool>();
do
{
if (Mod(e, 2) != 0)
{
bits.Add(true);
}
else
{
bits.Add(false);
}
e = e >> 1;
} while (e != 0);
return bits;
}
private static int MultiMod(int m1, int m2, int n) // (m1 * m2) mod n
{
return Mod(Mod(m1, n) * Mod(m2, n), n);
}
private static int Mod(int m, int n)
{
return m % n;
}
}
}
private static int MultiMod(int m, int e, int n)
{
if (m % n == 0)
{
return 0;
}
if (e == 1)
{
return m % n;
}
return ((m % n) * fun(m, e - 1, n)) % n;
}