关于一个求解同余方程的函数

子虚 2012-10-21 01:03:40
最近看了一个求解A*X mod B = 1的函数(也可以说是求A*X + B*Y = 1的X的最小正数解), 用于计算RSA加解密的密钥, 我了解欧几里德算法及其拓展算法, 但我还是看不懂下面的函数是如何实现的, 希望高手帮帮忙.

int Euc(int A, int B)
{
int a = A, b = B;
int quotient, remainder, lastY;
int x = 0, y = 1;

int X = 1, Y = 1;

while (a)
{
quotient = b / a;
remainder = b % a;
b = a;
a = remainder;
lastY = y;
y *= quotient;

if (X == Y)
{
if (x >= y)
{
y = x - y;
}
else
{
y = y - x;
Y = 0;
}
}
else
{
y = x + y;
X = 1 - X;
Y = 1 - Y;
}

x = lastY;
}

if (X == 0)
{
x = B - x;
}

return x;
}
...全文
468 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
GK_2014 2014-11-03
  • 打赏
  • 举报
回复
共勉,我工作中也遇到这个东东了,打算买本算法导论钻研钻研
子虚 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

不就是辗转相除么?
另外转换公式应该是A*X - B*Y = 1
[/Quote]
终于找到懂的了. 对, 就是辗转相除. 写成A*X + B*Y = 1是因为B可以为负数, 呵呵.
既然你懂, 那请你告诉我变量X, Y是用来干嘛的, 小写的变量x,y的初值是如何得到的, 谢谢. 感激不尽.
nice_cxf 2012-11-01
  • 打赏
  • 举报
回复
不就是辗转相除么?
另外转换公式应该是A*X - B*Y = 1
子虚 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

看看算法导论里面有关欧几里得以及欧几里得扩展部分的证明,你就明白了。
[/Quote]
对不起, 本来想回复6楼的, 一下点错了, 也没有权限删除. 抱歉.
子虚 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

试了一下,此函数得不出正确的结果。
[/Quote]
我说几点:
1. 两个实参A和B是不是int型范围内的正整数;
2. 两个实参A和B是不是互质的;
3. 验证一下是否有 A*函数返回值 mod B != 1.
如果上述三个问题的回答都是"是", 请将你的实参A和B告诉我. 否则, 你自己看着办吧.
子虚 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

看看算法导论里面有关欧几里得以及欧几里得扩展部分的证明,你就明白了。
[/Quote]
我说几点:
1. 两个实参A和B是不是int型范围内的正整数;
2. 两个实参A和B是不是互质的;
3. 验证一下是否有 A*函数返回值 mod B != 1.
如果上述三个问题的回答都是"是", 请将你的实参A和B告诉我. 否则, 你自己看着办吧.
c090869 2012-10-24
  • 打赏
  • 举报
回复
试了一下,此函数得不出正确的结果。
AndyZhang 2012-10-22
  • 打赏
  • 举报
回复
看看算法导论里面有关欧几里得以及欧几里得扩展部分的证明,你就明白了。
pw2156314 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用 2 楼 的回复:

A*X mod B = 1的意思不是A乘以一个X除以B余1么?

对, 这种方程可以转化成AX + BY = 1后使用拓展欧几里德算法来求, 但是拓展欧几里德算法(不管是递归的还是迭代的)不能保证求出的X是正的, 虽然可以用X+B让它变成正的. 而本程序使用的方法得到的X是最小的满足条件的正数, 而且好像没有利用拓展欧几里德算法或者利用了我没看出来, 所以前来求助……
[/Quote]长见识了~
子虚 2012-10-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

A*X mod B = 1的意思不是A乘以一个X除以B余1么?
[/Quote]
对, 这种方程可以转化成AX + BY = 1后使用拓展欧几里德算法来求, 但是拓展欧几里德算法(不管是递归的还是迭代的)不能保证求出的X是正的, 虽然可以用X+B让它变成正的. 而本程序使用的方法得到的X是最小的满足条件的正数, 而且好像没有利用拓展欧几里德算法或者利用了我没看出来, 所以前来求助, 求高手看看是怎么实现的, 又是如何保证X是正数的, 这才是我的目的. 目前看来懂的人不多.
Q3277631 2012-10-21
  • 打赏
  • 举报
回复
A*X mod B = 1的意思不是A乘以一个X除以B余1么?
慧钦 2012-10-21
  • 打赏
  • 举报
回复
题目是什么意思?

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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