如何用代码实现这个算法

snowekin 2007-10-30 10:00:36

...全文
106 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lalac 2007-10-31
  • 打赏
  • 举报
回复
很困了,懒得再调了,LZ自己试试吧。

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;
}
}
}


显示结果如下:
(79^(2^0)) mod 90 = 79
(79^(2^1)) mod 90 = 31
(79^(2^2)) mod 90 = 61
(79^(2^3)) mod 90 = 31
(79^(2^4)) mod 90 = 61
(79^(2^5)) mod 90 = 31
Result = 19
snowekin 2007-10-31
  • 打赏
  • 举报
回复
谢谢呀,我去试试,不过知道怎么给你加分呀?
lalac 2007-10-31
  • 打赏
  • 举报
回复
或者用这样的递归,不过可能会造成堆栈溢出。

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;
}

snowekin 2007-10-30
  • 打赏
  • 举报
回复
第一张图太小了,第二张图正好,由于我的疏忽,截图的光标处应该是没有a的,希望大家注意。还有,只要是满足第一行的要求就行,不一定要用这个算法,希望大家帮个忙,给个思路也可以,谢谢了。我想到用递归,不过代码实现有些问题,恳请指教。
snowekin 2007-10-30
  • 打赏
  • 举报
回复

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧