>

C에서 데이터 유형에 대한 자체 제한을 설정할 수 있습니까? 나는 메가 큰 숫자와 관련된 문제를 해결하고 있으며 많은 덧셈과 곱셈을 수행하고 최종 결과를 원하는 수로 계산하려고합니다 (1537849). 따라서 데이터 유형의 한계를 재설정 할 수 있는지 궁금합니다 따라서 프로세서가 정상적으로 수행하지만 원하는 한계를 갖는 것처럼 연산의 결과가 지정된 숫자를 초과 할 때 원하는 수를 모듈로 자동으로 가져옵니다. 그런 일이 불가능하다면 그러한 문제를 협상하는 가장 효율적인 방법은 무엇입니까?

수정 :

(2 ^ 1000) % 1537849를 계산하고 결과를 변수 monster 에 배치하려고합니다. . 아래는 문제를 극복하려는 나의 시도입니다 :

uint64_t monster = 1;
uint32_t power = 1000;
for (uint32_t i = 0; i < power; i ++ ) {
    monster *= 2;
    if (i%64==63) monster %= 1537849;
}
monster %= 1537849;

그렇게하는 더 좋은 방법이 있습니까 (다른 알고리즘, 라이브러리를 사용하여 ...)?

  • 답변 # 1

    와이즈 비즈

    기본 타입의 한계는 컴파일러마다 고정되어 있습니다.

    와이즈 비즈 덧셈과 곱셈의 모든 단계에서 코드는 모듈로를 반복적으로 수행 할 수 있습니다. 원래 숫자가 N 비트 인 경우 최대 2 비트 수학보다 필요하지만 2N 비트 수학으로 수행하는 것이 더 쉽습니다. 무제한 넓은 수학은 비효율적이며이 작업에는 필요하지 않습니다.

    Can I set my own limits for data types in C?

    의 예제 코드

    I wish to perform many additions and multiplications and to take the final result modulo some desired number, say 1537849

     그리고 +  모듈로 제한이있는 경우 :
    범위 제한이없는 모듈 식 지수

    *
    
    

  • 답변 # 2

    pow()

    아니요. 자신 만의 컴파일러와 라이브러리를 작성하는 데 부족합니다.

    와이즈 비즈

    부분적으로 많은 수를 처리하는 알고리즘이 있으며 ... 예를 들어 이미 작업을 수행하는 라이브러리가 있습니다. GNU 다중 정밀도 산술 라이브러리 (GMP)를 살펴보십시오.

    uintmax_t addmodmax(uintmax_t a, uintmax_t b, uintmax_t mod); uintmax_t mulmodmax(uintmax_t a, uintmax_t b, uintmax_t mod); uintmax_t powmodmax(uintmax_t x, uintmax_t expo, uintmax_t mod);

  • 이전 javascript - angular 4 - 반응 형에서 라디오 버튼이 선택되었는지 확인
  • 다음 cURL을 ASPNet으로 변환