由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Military版 - 模重复平方算法
相关主题
他曾求学上海交通大学 ,说一口流利的英语,去过很多西方国家。他曾经和一位比我们不知道高到哪里去的美国人谈笑风生,结成了深厚的战斗友谊。他的表情包在网络盛极一时。他虽然长期在上海工作,但中央决定让他去北说说你们都被什么东西的价格震惊过?
王垠:商业计划支持AA: 亚裔进好大学比例高到畸形,毕业生没贡献 (转载)
美亚裔均寿87,Michigan更是高到90,NB国内房价特别是一线城市已经高到令人发指程度
外交宣德,文化外f,中国国际地位能高到哪儿去?菌斑廊五觉悟高到洞房抄党章吗?
中国富人移民美国大呼后悔死 税负高到难想象华人现在就相当于黄冈中学的学生
90后比菌版索男不知道高到哪里去了军版名媛分4个档次,从高到低
同样是小将,小破熊比周小平的人品不知道高到哪里去了大饥荒最严重的是哪些县?
柴静比另外一个姓柴的女人,不知道高到哪里去了!!!支持希拉里再一次证明了好莱坞比天朝演艺圈不知道高到哪里去了 (转载)
相关话题的讨论汇总
话题: mod话题: fast话题: iter话题: int话题: remainder
进入Military版参与讨论
1 (共1页)
s********0
发帖数: 71
1
在RSA算法里头经常要用到“求x的n次方模m”这样的过程,通常使用O(log(n))的模重
复平方算法来实现,提高效率。
其实这是大二学的《信息安全数学基础》里面的内容,那时为了考试需要(手算+写出
很罗嗦的过程),还专门写了代码放在Blog空间里考试的时候用—……
同样O(log(n))的递归算法其实很容易理解:
/* C */
int fast_mod(int x, int n, int m)
{
if (n == 0)
return 1;
else if (n % 2 == 0)
return square(fast_mod(x, n / 2, m)) % m;
else
return x * fast_mod(x, n - 1, m) % m;
}
#Python
fast_mod = lambda x, n, m: 1 if n == 0 else fast_mod(x, n / 2, m) ** 2 % m
if n % 2 == 0 else x * fast_mod(x, n - 1, m) % m
;Scheme
(define (even? n) (= (remainder n 2) 0))
(define (mod-fast x n m)
(define (square x) (* x x))
(cond ((= n 0) 1)
((even? n) (remainder (square (mod-fast x (/ n 2) m)) m))
(else (remainder (* x (mod-fast x (- n 1) m)) m))))
(mod-fast 79 24 33)
;16
但是SICP要求写一个迭代版的。印象中我是记得可以把 n 写成二进制(比如n=13,
1101),然后一位一位地推。
试推了一下从高位到低位,倒是挺简单的,记B[i]为第 i 位的值,通过A[i] = A[i+1]
^2 * x^B[i] 从高到低计算出A[0],就得到结果了。但是问题是,为了从高到低计算,
又得一次递归,似乎不能满足要求。
于是只好反过来,从低位往高位推。这个过程其实也挺简单的,举例来说:
当n=13,即二进制的 1101 = 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0时,最终结果
ans = x^n % m
= x^(1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0) % m
= [x^(1 * 2^3)] * [x^(1 * 2^2)] * [(x ^ (0 * 2^1)] * [x ^ (1 * 2^0)] % m
也就是说,从低到高,在第 i 位的时候,将 x^(Bit[i] * 2^i) % m 乘到结果中即可
。这里可以稍微变换一下:仅当Bit[i] == 1的时候,将x^(2^i) % m乘进去即可。所以
这里可以用一个辅助的变量 b 来保存 x^(2^i) % m,在每次迭代的过程中 b = b^2 %
m 。
于是实现就容易了:
/* C */
int fast_mod_iter(int x, int n, int m)
{
int a = 1, b = x; //i=0的时候b = x^(2^0) = x
while (n)
{
if (n % 2 == 1)
a = a * b % m;
b = b * b % m;
n /= 2;
}
return a;
}
#Python
def fast_mod(x, n, m):
a = 1
b = x
while True:
if n == 0:
return a
if n % 2 == 1:
a = a * b % m
b = b * b % m
n /= 2
;Scheme
(define (even? n) (= (remainder n 2) 0))
(define (mod-fast-iter x n m)
(define (iter a b n)
(cond ((= n 0) a)
((even? n)
(iter a (remainder (* b b) m) (/ n 2)))
(else
(iter (remainder (* a b) m) (* b b) (/ (- n 1) 2)))))
(iter 1 x n))
(mod-fast-iter 79 24 33)
;16
//网上搜了下模重复平方算法,居然没有靠谱的算法解释,看来可能还是这个算法太简
单了吧。。。
r*****g
发帖数: 434
2
这么学术的东东放错地方了吧

在RSA算法里头经常要用到“求x的n次方模m”这样的过程,通常使用O(log(n))的模重
复平方算法来实现,提高效率。
其实这是大二学的《信息安全数学基础》里面的内容,那时为了考试需要(手算+写出
很罗嗦的过程),还专门写了代码放在Blog空间里考试的时候用—……
同样O(log(n))的递归算法其实很容易理解:
/* C */
int fast_mod(int x, int n, int m)
{
if (n == 0)
return 1;
else if (n % 2 == 0)
return square(fast_mod(x, n / 2, m)) % m;
else
return x * fast_mod(x, n - 1, m) % m;
}
#Python
fast_mod = lambda x, n, m: 1 if n == 0 else fast_mod(x, n / 2, m) ** 2 % m
if n % 2 == 0 else x * fast_mod(x, n - 1, m) % m
;Scheme
(define (even? n) (= (remainder n 2) 0))
(define (mod-fast x n m)
(define (square x) (* x x))
(cond ((= n 0) 1)
((even? n) (remainder (square (mod-fast x (/ n 2) m)) m))
(else (remainder (* x (mod-fast x (- n 1) m)) m))))
(mod-fast 79 24 33)
;16
但是SICP要求写一个迭代版的。印象中我是记得可以把 n 写成二进制(比如n=13,
1101),然后一位一位地推。
试推了一下从高位到低位,倒是挺简单的,记B[i]为第 i 位的值,通过A[i] = A[i+1]
^2 * x^B[i] 从高到低计算出A[0],就得到结果了。但是问题是,为了从高到低计算,
又得一次递归,似乎不能满足要求。
于是只好反过来,从低位往高位推。这个过程其实也挺简单的,举例来说:
当n=13,即二进制的 1101 = 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0时,最终结果
ans = x^n % m
= x^(1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0) % m
= [x^(1 * 2^3)] * [x^(1 * 2^2)] * [(x ^ (0 * 2^1)] * [x ^ (1 * 2^0)] % m
也就是说,从低到高,在第 i 位的时候,将 x^(Bit[i] * 2^i) % m 乘到结果中即可
。这里可以稍微变换一下:仅当Bit[i] == 1的时候,将x^(2^i) % m乘进去即可。所以
这里可以用一个辅助的变量 b 来保存 x^(2^i) % m,在每次迭代的过程中 b = b^2 %
m 。
于是实现就容易了:
/* C */
int fast_mod_iter(int x, int n, int m)
{
int a = 1, b = x; //i=0的时候b = x^(2^0) = x
while (n)
{
if (n % 2 == 1)
a = a * b % m;
b = b * b % m;
n /= 2;
}
return a;
}
#Python
def fast_mod(x, n, m):
a = 1
b = x
while True:
if n == 0:
return a
if n % 2 == 1:
a = a * b % m
b = b * b % m
n /= 2
;Scheme
(define (even? n) (= (remainder n 2) 0))
(define (mod-fast-iter x n m)
(define (iter a b n)
(cond ((= n 0) a)
((even? n)
(iter a (remainder (* b b) m) (/ n 2)))
(else
(iter (remainder (* a b) m) (* b b) (/ (- n 1) 2)))))
(iter 1 x n))
(mod-fast-iter 79 24 33)
;16
//网上搜了下模重复平方算法,居然没有靠谱的算法解释,看来可能还是这个算法太简
单了吧。。。

【在 s********0 的大作中提到】
: 在RSA算法里头经常要用到“求x的n次方模m”这样的过程,通常使用O(log(n))的模重
: 复平方算法来实现,提高效率。
: 其实这是大二学的《信息安全数学基础》里面的内容,那时为了考试需要(手算+写出
: 很罗嗦的过程),还专门写了代码放在Blog空间里考试的时候用—……
: 同样O(log(n))的递归算法其实很容易理解:
: /* C */
: int fast_mod(int x, int n, int m)
: {
: if (n == 0)
: return 1;

1 (共1页)
进入Military版参与讨论
相关主题
支持希拉里再一次证明了好莱坞比天朝演艺圈不知道高到哪里去了 (转载)中国富人移民美国大呼后悔死 税负高到难想象
中国的吉他神童,比老大爷不知道高到哪里去了!90后比菌版索男不知道高到哪里去了
按SAT, 从高到低同样是小将,小破熊比周小平的人品不知道高到哪里去了
水平比日本不知高到哪里去了柴静比另外一个姓柴的女人,不知道高到哪里去了!!!
他曾求学上海交通大学 ,说一口流利的英语,去过很多西方国家。他曾经和一位比我们不知道高到哪里去的美国人谈笑风生,结成了深厚的战斗友谊。他的表情包在网络盛极一时。他虽然长期在上海工作,但中央决定让他去北说说你们都被什么东西的价格震惊过?
王垠:商业计划支持AA: 亚裔进好大学比例高到畸形,毕业生没贡献 (转载)
美亚裔均寿87,Michigan更是高到90,NB国内房价特别是一线城市已经高到令人发指程度
外交宣德,文化外f,中国国际地位能高到哪儿去?菌斑廊五觉悟高到洞房抄党章吗?
相关话题的讨论汇总
话题: mod话题: fast话题: iter话题: int话题: remainder