제곱에 의한 지수화
Exponentiation by squaring![]() |
이 기사는 검증을 위해 추가적인 인용이 필요합니다. 찾기 : – · · 책 · (2018년 2월) (이 를 및 |
수학과 컴퓨터 프로그래밍에서, 제곱에 의한 지수화(exponentifieration)는 다항식이나 제곱 행렬과 같은 반군의 큰 양의 정수 거듭제곱의 빠른 계산을 위한 일반적인 방법입니다.일부 변형을 일반적으로 제곱 및 곱셈 알고리즘 또는 이진 지수화라고 합니다.모듈러 산술이나 행렬의 동력화와 같은 일반적인 용도로 사용될 수 있습니다.암호학에서 사용되는 타원 곡선처럼 가법 표기가 일반적으로 사용되는 반군의 경우 이 방법을 이중 및 덧셈이라고도 합니다.
기본법
재귀 버전
이 방법은 임의의 n> 에 대해다음을 갖는다는 관찰을 기반으로 합니다.
지수가 0이면 답은 1이고, 지수가 음수이면 양수를 사용하여 값을 다시 작성하여 이전 공식을 다시 사용할 수 있습니다.그것은,
이들은 함께 다음과 같은 재귀 알고리즘으로 직접 구현될 수 있습니다.
In: 정수 x; 정수 n Out: x exp_by_squaring(x, n) n < 0이면 exp_by_squaring(1 / x, -n)을 반환하고, 그렇지 않으면 n = 0이면 1을 반환하고, 그렇지 않으면 n이 짝수이면 exp_by_squaring(x * x, n / 2)을 반환하고, n이 홀수이면 x * exp_by_squaring(x * x, (n - 1) / 2)을 반환하고, 함수를 종료합니다.
각 재귀 호출에서 n의 이진법 표현의 최하위 숫자가 제거됩니다.다음은 재귀 호출의 수가 ⌈ ⌉ n의 이진 표현의 비트 수 입니다.따라서 이 알고리즘은 이 제곱의 수와 n의 이진법에서 1의 수와 같은 수의 곱셈을 계산합니다.이 로그 연산 수는 n - 1 곱셈이 필요한 사소한 알고리즘과 비교해야 합니다.
이 알고리즘은 꼬리가 반복적이지 않습니다.이는 재귀적 호출의 수에 거의 비례하는 보조 메모리의 양이 필요하다는 것을 의미하며, 반복당 데이터의 양이 증가하는 경우에는 더 많을 수도 있습니다.
다음 섹션의 알고리즘은 다른 접근 방식을 사용하며, 결과 알고리즘은 동일한 수의 연산이 필요하지만 결과를 저장하는 데 필요한 메모리와 거의 동일한 보조 메모리를 사용합니다.
일정한 보조 메모리 사용
이 섹션에서 설명하는 변형은 공식에 기초합니다.
이 공식을 재귀적으로 적용하면 y = 1로 시작하면 결국 0과 같은 지수를 얻게 되고 원하는 결과는 왼쪽 요인이 됩니다.
이 기능은 꼬리 재귀적 기능으로 구현될 수 있습니다.
기능. exp_by_squaring(x, n) 돌아가다 exp_by_squaring2(1, x, n) 기능. exp_by_squaring2(y, x, n) 한다면 n < 0 그리고나서 돌아가다 exp_by_squaring2(y, 1 / x, - n); 또 다른 한다면 n = 0 그리고나서 돌아가다 y; 또 다른 한다면 n 가 심지어. 그리고나서 돌아가다 exp_by_squaring2(y, x * x, n / 2); 또 다른 한다면 n 가 이상한 그리고나서 돌아가다 exp_by_squaring2(x * y, x * x, (n - 1) / 2).
알고리즘의 반복 버전은 또한 유계 보조 공간을 사용하며, 다음과 같이 주어집니다.
기능. exp_by_squaring_(x, n) 한다면 n < 0 그리고나서 x := 1 / x; n := -n; 한다면 n = 0 그리고나서 돌아가다 1 y := 1; 하는 동안에 n > 1 하다 한다면 n 가 이상한 그리고나서 y := x * y; n := n - 1; x := x * x; n := n / 2; 돌아가다 x * y
알고리즘의 정확성은 이(가) 계산 중에 불변하고, 에는 1⋅ = {\ 1 x}= 이고, 에는 1 = }= 이기 때문입니다.
이 알고리즘들은 앞 절의 알고리즘과 정확히 동일한 연산 수를 사용하지만 곱셈은 다른 순서로 수행됩니다.
계산 복잡도
간단히 분석하면 이러한 알고리즘은 ⌊ ⌋ _ 제곱을 사용하고 최대 ⌊ 을 사용하며, 여기서 ⌊ ⌋ 는 바닥 함수를 나타냅니다.더 정확하게 말하면, 곱셈의 수는 n의 이진 확장에 존재하는 곱셈의 수보다 1 적습니다.n이 약 4보다 클 경우, 이는 베이스와 자신을 반복적으로 순진하게 곱하는 것보다 계산적으로 더 효율적입니다.
각 제곱은 이전의 자릿수의 약 두 배가 되므로, 두 d자리 숫자의 곱이 어떤 고정 k에 대한 O(dk) 연산으로 구현된다면, xn 연산의 복잡도는 다음과 같이 주어집니다.
2진법k
이 알고리즘은 기저 2에서k 지수를 확장한 후 x의n 값을 계산합니다.그것은 1939년에 브라우어에 의해 처음으로 제안되었습니다.아래 알고리즘에서 우리는 다음 함수 f(0) = (k, 0) 및 f(m) = (s, u)를 사용합니다. 여기서 m = u·2는 u가 홀수입니다.
알고리즘:
- 인풋
- G의 원소 x, 매개 변수 k > 0, 음이 아닌 정수 n = (n, n, ..., n) 및 미리 계산된 값 ...,x -1 {\ x^{5}, k
- 산출량
- G의 원소n x
y := 1; i := l - 1인 반면 i ≥ 0 do(s, u) := f(n) j := 1 to k - s do y := y y := y * x to s y := y i := i - 1 return y
최적의 효율성을 위해 k는 다음을[1] 만족하는 가장 작은 정수여야 합니다.
슬라이딩 윈도우 방식
이 방법은 2-aryk 방법의 효율적인 변형입니다.예를 들어, 이진 확장(110001 110)을 가지는 지수 398을 계산하기 위해 22진법k 알고리즘을 사용하여 길이 3의 윈도우를 구하고 1, x3, x6, x, x12, x, x24, x48, x, x49198, x, x9899, x, x19924, x, x, x, x398, x, x48, x, x, x, x, x, x, x96192, x, x398, x, x, x, x199, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x,2 x, x, x, x3, x, x, x, x6, x, x, x, x12
일반적인 알고리즘은 다음과 같습니다.
알고리즘:
- 인풋
- G의 원소 x, 음이 아닌 정수 n=(n, n, ..., n), 매개 변수 k > 0 및 사전 computed 값 x x - 1 x ..., x
- 산출량
- 원소 x는 G ∈.
알고리즘:
y := 1; i := l - 1인 반면 i > -1이면 n = 0이면 y := y' i := i - 1이면 s := max{i - k + 1, 0}이고 n = 0이면 s := s + 1이면 h := 1 ~ i - s + 1이면 y := y := (n, n, ..., n) y := y * x i := s - 1 리턴 y
몽고메리의 사다리 기술
지수화를 위한 많은 알고리즘은 측면 채널 공격에 대한 방어를 제공하지 않습니다.즉, 제곱과 곱셈의 순서를 관찰하는 공격자는 계산에 관련된 지수를 (부분적으로) 복구할 수 있습니다.많은 공개 키 암호 시스템과 마찬가지로 지수를 비밀로 유지해야 하는 경우 이 문제가 발생합니다."몽고메리의 사다리"[2]라고 불리는 기술이 이 문제를 해결해 줍니다.
n = 1인 양의 0이 아닌 정수 n = (n...n)의 이진 확장을 고려하면 다음과 같이 x를 계산할 수 있습니다.
x = x; x = x for i = k - 2 ~ 0이면 n = x = x * x; x = x 기타 x = x * x; x = x 반환 x
알고리즘은 고정된 연산 시퀀스(로그 n까지)를 수행합니다. 즉, 비트의 특정 값에 관계없이 지수의 각 비트에 대해 곱셈과 제곱이 이루어집니다.두 배로 곱하기 위한 비슷한 알고리즘이 존재합니다.
Montgomery의 Ladder의 이 특정 구현은 아직 캐시 타이밍 공격으로부터 보호되지 않습니다. 비밀 지수의 비트 값에 따라 서로 다른 변수가 액세스되기 때문에 메모리 액세스 지연 시간이 공격자에게 여전히 관찰 가능할 수 있습니다.최신 암호화 구현에서는 "산란" 기법을 사용하여 프로세서가 항상 더 빠른 캐시를 놓치도록 합니다.[3]
고정 기저 지수
기저가 고정되고 지수가 변화할 때 x를n 계산하는 데 사용할 수 있는 몇 가지 방법이 있습니다.보시다시피 사전 계산은 이러한 알고리즘에서 핵심적인 역할을 합니다.
야오의 방법
Yao의 방법은 radix b = 2에서 지수를 확장하고 계산은 위의 알고리즘에서 수행된 것과 같은 2진법과 직교합니다.n, ni, b, b를i 정수라 하자.
지수 n을 다음과 같이 쓰도록 합니다.
여기서 ∈[ - 에 대해 0 ⩽ ni < {\
x를 = x라고 합니다.
그러면 알고리즘은 동일성을 사용합니다.
G의 원소 x와 위의 형태로 쓰여진 지수 n이 미리 계산된 값 xb0...x와bw−1 함께 주어지면, 원소 x는n 아래의 알고리즘을 사용하여 계산됩니다.
y = 1, u = 1, j = h - 1인 반면 i = 0 ~ w - 1인 경우 n = j, u = u x x y = y x u j = j - 1 반환 y
만약 우리가 h = 2이고 b = h를 설정한다면, n개의 값은 단순히 n개의 숫자(베이스 h)가 됩니다.Yao의 방법은 가장 높은 출력 -1 에 나타나는 x를i u에서 먼저 수집합니다 다음 라운드에서는 h - 에 나타나는 x를 u 등에서도 수집합니다.변수 y는 u와 h- 번 곱하고, - 번 곱하고, 그 다음으로 높은 검정력을 갖는 h - 2 {\displaystyle h-1}회 곱합니다.알고리즘은 + - w번의 곱셈을 하며 x를n 계산하려면 + 개의 요소를 저장해야 합니다.[1]
유클리드법
유클리드 방법은 P에 의해 사전 계산과 벡터 덧셈 체인을 사용한 효율적 지수화에서 처음 도입되었습니다.루이즈 박사님.
group G에서 x 을 계산하는 방법(n은 자연 정수이며 알고리즘은 아래와 같습니다)은 다음과 같은 등식을 재귀적으로 사용합니다.
여기서 = ⌊ n ⌋ q =\ floor 즉, 지수 n을 n으로 나눈 유클리드식 분할은 몫 q와 휴식 n modn을 반환하는 데 사용됩니다.
그룹 G의 기본 요소 x와 야오의 방법과 같이 쓰인 지수 이 주어지면, 요소 x 은 사전 계산 값 x }}, 를 사용하여 계산됩니다.
가 [0 l- ∀ [ l - ] {\ - M ≥ \ ∈ 찾기([ l- ] -M) - M n ≥ i i - big}}, ∀ {\ (}[0, l-1] - M} N 이면 를 끊습니다. q M/ q \ n_n_{}}라고 N ( N) } (} 이라고 합니다 재귀적으로 를 계산한 다음 x x x x_ 끝 lop; x = x}= x_를 반환합니다.
알고리즘은 먼저 n 중에서 가장 큰 값을 찾은 다음 {n \i ≠ M}의 집합 내에서 최댓값을 찾습니다. 그런 다음 x를 거듭제곱 q로 올리고 이 값을 x와 곱한 다음 x에 이 계산의 결과를 할당하고 n 모듈론 값을 할당합니다.
추가 응용프로그램
이 접근법은 또한 큰 지수 모듈로 수를 빠르게 계산할 수 있는 등 특성이 0이 아닌 세미그룹과도 작동합니다.특히 암호학에서는 정수 모듈 q의 링에서 거듭제곱을 계산하는 것이 유용합니다.예를 들어, 다음의 평가.
- 13789 (mod 2345) = 2029
13789를722341 계산한 다음 2345로 나누었을 때 나머지를 가져가는 순진한 방법을 사용한다면 매우 오랜 시간과 많은 저장 공간이 소요될 것입니다.더 효과적인 방법을 사용하더라도 시간이 오래 걸립니다: 제곱 13789, 2345로 나누었을 때 나머지를 구하고 결과에 13789를 곱하는 식입니다.
x * y = xy mod 2345 (즉, 곱셈 뒤에 나머지가 있는 나눗셈)로 해석되는 "*"를 사용하여 위의 exp-by-squaring 알고리즘을 적용하면 정수의 곱셈과 나눗셈이 27개만 생성되며, 이는 모두 하나의 기계어에 저장될 수 있습니다.일반적으로, 이러한 접근 방식들 중 어느 것이든 2log2 (722340) ≤ 40 모듈러 곱셈보다 적은 수의 시간이 소요됩니다.
이 접근법은 또한 규칙을 사용하여 그룹의 정수 거듭제곱을 계산하는 데 사용될 수 있습니다.
- 검정력(x, -n) = (검정력(x, n)).
이 접근법은 비상호화 세미그룹에서도 사용되며 종종 행렬의 거듭제곱을 계산하는 데 사용됩니다.
보다 일반적으로, 이 접근법은 이진 연산이 전력 연상인 모든 마그마에서 작동합니다.
부호화된 자리수의 녹음
특정 계산에서 음의 계수를 허용하는 것이 더 효율적일 수 있으며, 따라서 G의 반전이 "빠른" 또는 미리 계산된 경우에는 기저의 역을 사용할 수 있습니다.예를 들어, x를2k−1 계산할 때 이항법은 k-1 곱셈과 k-1 제곱을 필요로 합니다.그러나 사람은 x를2k 얻기 위해 k개의 제곱을 수행한 다음 x를−1 곱하여 x를2k−1 얻을 수 있습니다.
이를 위해 정수 n의 부호화된 숫자 표현을 radix bas로 정의합니다.
서명된 이진 표현은 특정 선택 b = 2 및 ∈{- 0,에 해당합니다 ( - … n ) dots로 표시됩니다이 표현을 계산하는 몇 가지 방법이 있습니다.표현이 고유하지 않습니다.예를 들어 n = 478: 두 개의 구별된 부호가 있는 binary 표현은 ¯ ¯ )의 1100 } 및( 1 ¯ 1 ¯0 의 {\ {1이며 서 1 ¯ 은 -1을 나타냅니다.이진법은 n의 기본-2 표현에서 0이 아닌 모든 항목에 대한 곱셈을 계산하기 때문에 0이 아닌 항목의 수가 가장 적은 부호화된 이진 표현, 즉 해밍 가중치가 최소인 표현을 찾는 데 관심이 있습니다.이를 위한 한 가지 방법은 , 즉 로 표현을 계산하는 것인데, 이는 ⩾ 0 = all 0을(를) 만족하며(l - … 0 ) {\dots예를 들어 478의 NAF 표현은 0) 이 표현은 항상 최소 해밍 무게를 가집니다.지정된 n =( - … 0) 2 n = ( = - = }= }= 의 NAF 표현을 계산하는 간단한 알고리즘은 다음과 같습니다.
i의 경우 0 }= {\displaystyle _{0} floor +1\ n + - + 1 }= 반환( l- … n
Koyama and Tsuroka의 또 다른 알고리즘은 = + = 0 } =} = 조건을 요구하지 않지만 그래도 해밍 가중치를 최소화합니다
대안 및 일반화
제곱에 의한 지수화는 차선의 추가 체인 지수화 알고리즘으로 볼 수 있습니다. 반복되는 지수 이중화(제곱) 및/또는 증가 지수를 1만큼(x를 곱한) 추가 체인에 의해 지수를 계산합니다.보다 일반적으로, 이전에 계산된 지수를 합산할 수 있다면(이러한 x의 거듭제곱을 곱함으로써) 때때로 더 적은 곱셈을 사용하여 지수화를 수행할 수 있습니다(일반적으로 더 많은 메모리를 사용함).n = 15의 경우 가장 작은 전력이 발생합니다.
- × (×[ x× ] ) }= x제곱, 6배수),
- ×([ ] 2) x}= (최적 덧셈 체인, x를 재사용할 경우 5배수).
일반적으로 주어진 지수에 대한 최적의 덧셈 체인을 찾는 것은 어려운 문제이며, 이에 대해 효율적인 알고리즘이 알려져 있지 않기 때문에 최적의 체인은 일반적으로 작은 지수에만 사용됩니다(예: 작은 거듭제곱에 대한 체인이 미리 표로 작성된 컴파일러).그러나 최적은 아니지만 추가 부기 작업 및 메모리 사용 비용을 제곱하여 지수화하는 것보다 곱셈 수가 적은 휴리스틱 알고리즘이 많이 있습니다.그럼에도 불구하고, 곱셈의 수는 θ(log n)보다 더 느리게 증가하지 않으므로, 이러한 알고리즘은 기껏해야 일정한 인자로만 제곱하여 지수화할 때 점근적으로 개선됩니다.
참고 항목
메모들
- ^ 이 행에서 루프는 0이 아닌 값에서 길이가 kending보다 작거나 같은 가장 긴 문자열을 찾습니다.2에서 x -1 {\1}}의 모든 홀수 파워를 계산할 필요는 없으며, 특히 계산에 관련된 파워만 고려하면 됩니다.
참고문헌
- ^ a b Cohen, H.; Frey, G., eds. (2006). Handbook of Elliptic and Hyperelliptic Curve Cryptography. Discrete Mathematics and Its Applications. Chapman & Hall/CRC. ISBN 9781584885184.
- ^ Montgomery, Peter L. (1987). "Speeding the Pollard and Elliptic Curve Methods of Factorization" (PDF). Math. Comput. 48 (177): 243–264. doi:10.1090/S0025-5718-1987-0866113-7.
- ^ Gueron, Shay (5 April 2012). "Efficient software implementations of modular exponentiation" (PDF). Journal of Cryptographic Engineering. 2 (1): 31–43. doi:10.1007/s13389-012-0031-5. S2CID 7629541.