문제
부가가치 부문에 알고리즘을 처리 할 수 있는 큰 정수(128-bit).나는 이미 요청을 어떻게 그것을 통해 비트 시프트 연산자입니다.그러나,현재 구현하는 것 같한 접근 방식
기본적으로 저장 두 번호 long long unsigned int
'의 형식
A * 2 ^ 64 + B
가 B < 2 ^ 64
.
이 번호는 의해 나눌 24
나는 그것을 분할하여 24
.
현재 접근 방식은 그것을 변형시키아
A * 2 ^ 64 + B A B
-------------- = ---- * 2^64 + ----
24 24 24
A A mod 24 B B mod 24
= floor( ---- ) * 2^64 + ---------- * 2^64 + floor( ---- ) + ----------
24 24.0 24 24.0
그러나,이것이 버그가 있습니다.
(참고로 바닥이 A / 24
그 mod
가 A % 24
.정상 부문에 저장됩 long double
, 정수에 저장됩 long long unsigned int
.
이 24
과 동일 11000
바이너리,두 번째 급수식을 변경하지 않아야 합 뭔가 의 범위에서 네 번째로 급수식 때문에 이동이 64 비트입니다.
경우에 따라서, A * 2 ^ 64 + B
로 나눌 24,B 지 않은,그것을 보여줍 쉽게는 그것이 버그 때문에 그것이 일부를 반환 non-정수 번호입니다.
는 무엇입에 오류가 나의 구현?
해결책
가장 쉬운 방법으로 생각할 수 있는 이렇게 치료하는 128 비트 숫자 개의 32 비트 숫자:
A_B_C_D = A*2^96 + B*2^64 + C*2^32 + D
고 다음을 수행 긴 부문하여 24:
E = A/24 (with remainder Q)
F = Q_B/24 (with remainder R)
G = R_C/24 (with remainder S)
H = S_D/24 (with remainder T)
가 X_Y
수단 X*2^32 + Y
.그 대답은 E_F_G_H
나머지 부분으로 T
.모든 지점에서만 필요한 부문이 64 비트 숫자,이해야 할 수 있으로 정수 작업을니다.
다른 팁
이것이 가능하게 해결 될 역 곱셈?첫번째 것을 사항 24 == 8 * 3
그래서 결과
a / 24 == (a >> 3) / 3
자 x = (a >> 3)
다음의 결과는 부문 8 * (x / 3)
.지금 그것을 유지하는 값을 찾아서 x / 3
.
모듈산국 존재가 있는 번호 n
러 n * 3 == 1 (mod 2^128)
.이렇게 하:
x / 3 = (x * n) / (n * 3) = x * n
그것은 남아 있을 찾기 위해 일정한 n
.가하는 방법에 대한 설명에 이렇게 wikipedia.당신은 또한 기능을 구현하는 곱하기 128 비트 숫자입니다.
이게 도움이 되었으면 좋겠습니다.
/A.B.
당신이 사용하지 않아야 long double
의"정상적인 부서"하지만 정수로 근처에 위치하고 있습니다. long double
가 충분하지 않 중요한 인물 답을 얻으려면 오른쪽으로(그리고 어쨌든 요점은 이렇게 정수 작업이 올바른?).
이후 24 같 11000 에서는 바이너리,두 번째 급수식을 변경하지 않아야 합 뭔가 의 범위에서 네 번째로 급수식 때문에 이동이 64 비트입니다.
귀하의 공식 서면에서 실제 숫자입니다.(Mod24)/24 있을 수 있는 임의의 수수(1/24,예를 들 0.041666666...)및 수 있습니다 따라서 방해하는 네 번째 용어의 분해,한 번도 곱 2^64.
제공하는 Y*2^64 을 방해하지 않는 낮은 무게 이진수에 추가 작동할 때 Y 정수입니다.
하지 않습니다.
를 잡아 가고 라이브러리를 이렇게 물건을-당신은 매우 감사를 선택하는 디버깅할 때 이상한 오류가 있습니다.
Snippets.org C/C++BigInt 라이브러리에서 그것은 사이트하는 동안 전,Google 도까지 다음과 같다: http://mattmccutchen.net/bigint/