我正在尝试实施Rabin cryptosystem,而我却陷入了解密步骤。我需要解决:
当Y p * p + Y p * q = 1
Yp
和Yq
已知(已给定)时,并计算p
和q
。
让我们以维基百科为例,p = 7
和q = 11
;那我们就有了:
Yp * 7 + Yq * 11 = 1;
使用extented Euclidean algorithm我们应该得到结果:
Yp = -3
和Yq = 2
;
这是来自Wiki的伪代码:
//pseudo code
function extended_gcd(a, b)
if b = 0
return (1, 0)
else
(q, r) := divide (a, b)
(s, t) := extended_gcd(b, r)
return (t, s - q * t)
这是我到目前为止所做的:
//q = 11; p = 7;
$arr = array(11, 7); //test number from wiki;
$result = extendedGcd($arr); //output array(0,1)
//but should be: array(-3, 2); (from wiki example)
...
//Legend: arr[0] = a; arr[1] = b;
function extendedGcd($arr){
if ($arr[1] == 0) return array(1, 0);
else{
//( (q, r) := divide (a, b) ) == ( q := a div b, r = a − b * q );
$q = floor($arr[0] / $arr[1]); $r = $arr[0] - $arr[1] * $q;
$tmp = extendedGcd($arr[1], $r);
$s = $tmp[0]; $t = $tmp[1];
return array($t, $s - $q * $t);
}
}
我不知道出了什么问题。如何计算Yp和Yq?
//thank to NullUserException ఠ_ఠ
function extendedGcd($arr){
if ($arr[1] == 0) return array(1, 0);
else{
$q = floor($arr[0] / $arr[1]);
$r = $arr[0] % $arr[1];
$temp = extendedGcd(array($arr[1], $r));
$s = $temp[0]; $t = $temp[1];
return array($t, $s - $q * $t);
}
}
非递归的。 (我知道它看起来很难看,但仍然有效。
function extendedGcd($a, $b){
$x = 0; $lastx = 1;
$y = 1; $lasty = 0;
while ($b != 0){ //while b ≠ 0
$quotient = floor($a / $b);
$tempA = $a; $a = $b; $b = $tempA % $b;
echo '<br />$a = '.$a.'; $b = '.$b;
echo '<br />$quotient = '.$quotient;
$tempX = $x;
$x = $lastx - $quotient * $x;
$lastx = $tempX;
$tempY = $y;
$y = $lasty - $quotient * $y;
$lasty = $tempY;
echo '<br />$lastx = '.$lastx.'; $lasty = '.$lasty.'<hr />';
}
return array($lastx, $lasty);
}
答案 0 :(得分:1)
你的问题是你这样调用extendedGcd()
:extendedGcd($arr[1], $r);
,当它实际上只接受一个参数(一个数组)时。以下是我将如何重写该函数:
function extendedGcd($a, $b){
if ($b == 0)
return array(1, 0);
$q = floor($a / $b);
$r = $a % $b; // PHP does have a modulus operator
list($s, $t) = extendedGcd($b, $r);
return array($t, $s - $q * $t);
}
print_r(extendedGcd(11, 7));
为您提供the result expected。
PS:在测试算法正确性的过程中,我使用了这个Python函数:
def extended_gcd(a, b):
if b == 0:
return (1, 0)
else:
(q, r) = (a/b, a%b)
(s, t) = extended_gcd(b, r)
return (t, s - q * t)
难以置信的美丽,不是吗?