문제

부가가치 부문에 알고리즘을 처리 할 수 있는 큰 정수(128-bit).나는 이미 요청을 어떻게 그것을 통해 비트 시프트 연산자입니다.그러나,현재 구현하는 것 같한 접근 방식

기본적으로 저장 두 번호 long long unsigned int'의 형식

A * 2 ^ 64 + BB < 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 / 24modA % 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.

모듈산국 존재가 있는 번호 nn * 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/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top