クイックインデックスアルゴリズム
1085 ワード
質問の概要
RSAでは、加算、復号処理はいずれも、ある整数の整数次べき乗を要求してから型をとる.多くの場合、この2つの整数は比較的大きいが、この場合、直接意味で計算を行うと、計算機が許容する整数の値範囲を超えてしまう(例えば計算(66^{77})、これは比較的小さい).一方,我々も計算の効率を考慮する必要があり,(66^{77})直接定義に従って計算すると76回乗算する必要があり,オーバーヘッドはかなり大きい.この2つの問題に対して,大きな整数のべき乗演算を効率的かつ正確に計算するための良いアルゴリズムが必要である.
初歩的な考え方.
第1の問題,すなわち数値過大の問題に対して,モジュール演算の性質:[(a*b)(mod n)=[(a(mod n))*(b(mod n)](mod n)]を用いることで中間値を効果的に低減できることが考えられる.2つ目の問題では、指数の性質を利用して、各部の結果を二乗演算を繰り返すことができ、最低でも演算回数を(log_2 n)に減らすことができ、(x^{16})を計算する場合、[x^2,x^4,x^8,x^{16}]は4回しか計算できず、定義計算より3/4減少した.
クイックインデックスアルゴリズム
高速指数アルゴリズムは上記の2つの思想を統合し、アルゴリズムは以下のように説明されている.
通常、我々が(a^mmodn)を計算する際には、まずmをバイナリ形式(b_k,b_{k−1},…,b_0)と表し、すなわち[m=sumlimits_{b_i=1}2^i]と表すので、[a^m=a^m=a^{sumlimits_{b_i=1}2^i}=prodlimits_{b_i=1}a^{b_i=1}a^{2^i}][a^mmodn=[prodmilits_{b_i=1}a^i^2^i^i}a^i{2^i{2^i}a^i{2^i{2^}]modn=prodlimits_{b_i=1}[a^{2^i}modn]\]
コードの簡略化:
突然思い出して、今日林先生の授業で私たちの講義の間違いは本当に多いと言っていましたが、私はあなたたちの能力ですべて正すことができると信じています.ううう、私は泣いて、午後からこの言葉を覚えています.
RSAでは、加算、復号処理はいずれも、ある整数の整数次べき乗を要求してから型をとる.多くの場合、この2つの整数は比較的大きいが、この場合、直接意味で計算を行うと、計算機が許容する整数の値範囲を超えてしまう(例えば計算(66^{77})、これは比較的小さい).一方,我々も計算の効率を考慮する必要があり,(66^{77})直接定義に従って計算すると76回乗算する必要があり,オーバーヘッドはかなり大きい.この2つの問題に対して,大きな整数のべき乗演算を効率的かつ正確に計算するための良いアルゴリズムが必要である.
初歩的な考え方.
第1の問題,すなわち数値過大の問題に対して,モジュール演算の性質:[(a*b)(mod n)=[(a(mod n))*(b(mod n)](mod n)]を用いることで中間値を効果的に低減できることが考えられる.2つ目の問題では、指数の性質を利用して、各部の結果を二乗演算を繰り返すことができ、最低でも演算回数を(log_2 n)に減らすことができ、(x^{16})を計算する場合、[x^2,x^4,x^8,x^{16}]は4回しか計算できず、定義計算より3/4減少した.
クイックインデックスアルゴリズム
高速指数アルゴリズムは上記の2つの思想を統合し、アルゴリズムは以下のように説明されている.
通常、我々が(a^mmodn)を計算する際には、まずmをバイナリ形式(b_k,b_{k−1},…,b_0)と表し、すなわち[m=sumlimits_{b_i=1}2^i]と表すので、[a^m=a^m=a^{sumlimits_{b_i=1}2^i}=prodlimits_{b_i=1}a^{b_i=1}a^{2^i}][a^mmodn=[prodmilits_{b_i=1}a^i^2^i^i}a^i{2^i{2^i}a^i{2^i{2^}]modn=prodlimits_{b_i=1}[a^{2^i}modn]\]
コードの簡略化:
d = 1
for i in range(k+1):
d = d*d%n
if b[i] == '1':
d = d*a%n
突然思い出して、今日林先生の授業で私たちの講義の間違いは本当に多いと言っていましたが、私はあなたたちの能力ですべて正すことができると信じています.ううう、私は泣いて、午後からこの言葉を覚えています.