를 크기 n 비트 의 고정 된 양의 정수라고 하자 .
이 정수를 적절하게 사전 처리 할 수 있습니다.
다른 양의 정수 주어 크기의 m의 비트 승산의 복잡도 무엇 B는 ?
를 크기 n 비트 의 고정 된 양의 정수라고 하자 .
이 정수를 적절하게 사전 처리 할 수 있습니다.
다른 양의 정수 주어 크기의 m의 비트 승산의 복잡도 무엇 B는 ?
답변:
항상 가장 효율적인 알고리즘은 아니지만이 질문은 추가 체인과 매우 밀접한 관계가 있습니다. 덧셈 체인에 의해 빠르게 계산하기위한 임의의 알고리즘 반복 덧셈 (각각의 덧셈은 물론 연산 임)에 의해 를 계산하기위한 알고리즘으로 변환된다 . 이에 반하여, 계산 빠른 알고리즘 임의 대한 산출 알고리즘에 짧은 리드 하지만, 물론이 알고리즘은 반드시 첨가 체인의 형태를 가질 필요는 없다; 여전히, 그것은 시작하기에 좋은 곳인 것 같습니다. 한 번 봐 가지고 http://en.wikipedia.org/wiki/Addition_chain을 하거나 권을 확인하십시오. 중 2f ( B ) = A B O ( n ) A B B A자세한 내용 은 컴퓨터 프로그래밍 기술 .
Steven Stadnicki의 아이디어를 확장하기 위해 Discrete Fourier Transform을 사용하여 행렬 곱셈보다 나은 순진 알고리즘을 신속하게 구성 할 수 있습니다.
우리는 의 수를 센다 . 비트의 절반 미만이 1이면 위치의 링크 된 목록을 구성합니다. 곱하기 위해 간단히 목록의 각 위치에서 왼쪽으로 이동 하고 (표시된 비트를 곱한 결과) 결과를 추가합니다.B
비트의 절반 이상이 1이면 위와 동일하지만 위치 목록을 채우는 대신 0을 사용합니다. 아이디어는 모든 합계를 곱하여 얻은 합계에서이 합계를 빼는 것입니다. 모든 것의 합을 얻기 위해 의 비트 수 만큼 를 이동 시키고 여기서 를 뺍니다 . 그런 다음 연결된 목록에서 얻은 합계를 뺍니다.A B
이를 순진한 연결 목록 알고리즘이라고 부를 수 있습니다. 실행 시간은 최악의 경우 이지만 평균 경우의 는 작은 경우 DFT보다 빠릅니다..O ( | B | √| A|
리스트의 아이디어를 최적으로 사용하기 위해 나누기와 정복을 사용합니다. 를 반으로 나누고 순진 알고리즘을 사용하여 관련 목록의 크기를 찾습니다. 그것들이 5보다 크면, 우리는 모든 반쪽을 5 개 이하로자를 때까지 5보다 큰 반쪽에서 순진 알고리즘을 다시 호출합니다. (이것은 이것을 4 개의 뺄셈으로 줄일 수 있기 때문입니다)
더 좋은 점은 분할 및 정복 알고리즘을 개선하는 것입니다. 우리는 가능한 모든 분기의 조합을 반복하여 탐욕스럽게 최고의 것을 선택합니다. 이 전처리는 실제 곱셈과 거의 같은 시간이 걸립니다.
전처리로 무한한 자유가 허용된다면 모든 분기에 대해 최적화 된 분할 및 정복 알고리즘을 최적으로 해결합니다. 최악의 경우에는 시간이 걸리지 만 더하기 체인 방법에 따라 최적이어야합니다.
위의 알고리즘에 대해보다 정확한 값을 계산하려고합니다.
상수에 의한 곱셈 이라는 문서 는 하위 선형 ( PDF )으로 이동 / 추가 연산에 대한 알고리즘을 제공합니다 . 여기서 은 상수의 크기입니다. .n
본질적으로, 이는 원하는 의해 작동 이들에만 곱하는 상수에 -bits 시프트 및 번호를 추가 진 긴 승산처럼 (일정한 비트 하단 수가 비트 승산 수단 될 상단은 이동 및 추가되지 않지만 비트는 상단이 이동 및 추가되었음을 의미합니다. 그러나 상수 에는 비트가 있을 수 있으므로 여전히 입니다.1 0 1 O ( 없음 ) O ( N ) 1
그런 다음이 논문은 상수의 숫자 표현을 이중 기수 시스템으로 변경하는 것에 대해 이야기합니다. 분명히 변환이 올바르게 수행되면 이 아닌 비트는 희소합니다 (매우 중복되는 수 시스템). 그들은 얼마나 희소한지를 계산합니다. 0이 아닌 비트의 수는 미만으로 제한 되므로 하위 선형 수의 덧셈이 필요합니다. 그러나 각 추가 의 비용 으로 인해 여전히 실제 작업입니다 (여기서 은 크기 상수이며 은 다른 숫자의 크기입니다.O ( 없음 ) O ( N mO(m)nm
그래서 귀하의 질문에 대답하기 위해, 예 당신이 얻을한다는 점에서, 행렬 - 벡터 곱셈과 유사한 결과가 이 일정하면 속도 향상; 물론이 속도 향상은 순진한 긴 곱셈에 지나지 않으며, 얻을 수있는 보다 훨씬 나은 곱셈 알고리즘이 있습니다. 이 알고리즘.O ( n 2
Matt Groff가 제안한 것처럼, 영감을 얻기 위해 연습 커뮤니티를 살펴 보는 것이 좋습니다 (또는 상황에서 이 현재 CPU의 비트 폭 내에있는 경우). 실제로, 정수에 의한 정수 곱셈의 문제는 많은 컴파일러 작성기 및 회로 설계자들에 의해 고려되어 왔지만, 일반적으로 "멀티플렉서없는 멀티플렉서 (shift, add 및 빼기 사용)"에 관심이 있습니다. 내가 알고있는 초기 참고 문헌 중 하나는 (Hacker 's Delight 섹션 8.4에서 이것을 배웠습니다).
Bernstein, R. (1986), 정수 상수의 곱셈. 소프트웨어 : 실습 및 경험, 16 : 641-652. 도 : 10.1002 / spe. 4380160704
Vincent Lefèvre의 최신 작품은 여기 에서 찾을 수 있으며 (그의 후속 작업을 확인하십시오) 효율적인 회로 합성 에 대한 CMU 프로젝트도 언급합니다 (참고 문헌 참조). 후자의 프로젝트는 상수 세트에 의한 동시 곱셈도 고려합니다.
추신 : 귀하의 사용자 이름을 인식 가능한 것으로 변경하는 것이 좋습니다.
이것이 질문과 직접 관련이 있는지 확실하지 않지만 다음과 같은 기본 결과가 흥미로울 수 있습니다. 고정 된 자연수 주어지면, 이 역 이진 표기법 (즉, 최하위 비트 우선)으로 기록 되는 경우, 연산 은 순차적 오토 마톤에 의해 실현 될 수있다 . 오토 마톤의 상태 수는 이며 여기서 은 나누는 의 최대 거듭 제곱입니다 . 예를 들어, 동작 은 다음의 자동 장치에 의해 실현된다.
예를 들어, 및 입니다. 따라서 역 이진에서 는 및 (나쁜 선택, 알고 있습니다 ...)으로 됩니다. 이 오토 마톤에서 항목을 처리하면 경로가 나타납니다. 01101010001