.NET BigInteger가 어떤 범위의 숫자로 설계되었는지 정확하게 설명하는 문서가 있습니까?


12

나는 .NET BigInteger를 가지고 놀고 있으며 기본적으로 어떤 숫자 ( 추정 된 대답이 좋을까요) 가 (곡선에 대한 (시간이 필요한 작업의 증가) 그래프) 곡선의 편차 지점 인지 궁금 합니다. (BigInteger의 가치))?

또는 우리가 BigInteger의 값 대 연산에 필요한 시간 증가를 1에서 무한대로 플롯하면 곡선이 완만 해 지도록 편차가 없도록 설계 되었습니까?

예를 들어, 어레이가 50 개 항목을 처리 할 수있는 기능으로 설계되었다고 가정합니다. 이것은 1 개의 항목이 있으면 작업 시간이 f (1) 시간이라는 것을 의미합니다. 그리고 2 개의 항목이 있으면 작업 시간은 f (2) 시간입니다. 50 개의 항목이 있으면 작업 시간은 f (50) 시간입니다. 그러나 50 개의 항목 만 처리하도록 설계되었으므로 51 개의 항목이있을 때 수행되는 작업은 g (51) (g (51)> f (51))입니다.

올바르게 구현 된 경우 BigInteger 산술의 복잡성은 부드러운 곡선이어야합니다. 예를 들어, 곱셈의 시간 복잡도는 O (NM) 여야합니다. 여기서 N은 첫 번째 곱하기의 자릿수이고 M은 두 번째 곱하기의 자릿수입니다. 물론 N과 M을 너무 많이 선택하여 숫자가 기계에 맞지 않을 수 있다는 실질적인 한계가 있습니다.

그와 같이 구현되었다고 주장하는 문서를 아는 사람이 있습니까?


3
@Down voters, down votes는 왜 질문이 좋은 질문이 아닌지를 설명하는 의견을 남길 수 없다면 아무 의미가 없습니다. 문제가없는 것으로 보았습니다.
머핀 맨

공감하지는 않았지만 여기서 어떤 질문이 있는지 잘 모르겠습니다. bigint (더하기, 곱하기, 나누기 등)에 대한 작업의 런타임 / 메모리 복잡도를 알고 싶습니까?
nikie

예를 들어, 어레이가 50 개 항목을 처리 할 수있는 기능으로 설계되었다고 가정합니다. 이것은 내가 1 개의 항목을 가지고 있고 작업이 f (1) 시간이라는 것을 의미합니다. 그리고 2 개의 항목이 있으면 작업 시간은 f (2) 시간입니다. 내가 50 항목을 가지고 있다면 작업은 f (50) 시간입니다. 그러나 50 개의 항목 만 처리하도록 설계되었으므로 51 개의 항목이있을 때 수행되는 작업은 g (51)입니다. 여기서 g (51)> f (51)
Pacerier

@Charles E. Grant 네! 이것이 내가 말하는 것입니다. 문제는 그것이 구현되었다고 주장하는 문서를 아는 사람이 있습니까?
Pacerier

@Paceier 나는 내 의견을 답변으로 옮기고 정확하게 이것을 설명하는 문서에 대한 링크를 추가했습니다.
Charles E. Grant

답변:


7

ULong.MaxValue보다 크거나 Long.MinValue보다 작은 숫자는 BigInteger를 사용하여 표시해야합니다.

NOT (Long.MinValue <= X <= ULong.MaxValue) 인 경우 BigInteger

BigInteger는 일반 기본 요소가 처리 할 수있는 것보다 너무 큰 수입니다.

예를 들어 정수가 Long 범위를 벗어나면 BigInteger를 사용해야합니다. 그러나 이러한 경우는 매우 드물며 이러한 클래스를 사용하면 기본 클래스보다 훨씬 높은 오버 헤드가 발생합니다.

예를 들어, long너비가 64 비트이며 범위를 -9,223,372,036,854,775,808에서 9,223,372,036,854,775,80으로 유지할 수 있습니다. ulong은 0에서 18,446,744,073,709,551,615를 유지할 수 있습니다. 숫자가 그보다 크거나 작은 경우 BigInteger가 유일한 옵션입니다

내가 실제 응용 프로그램에서 사용한 것을 본 유일한 시간은 별표 응용 프로그램이었습니다.

다음 사항도 참조 : .NET의 기본 범위


나는 물론 우리가 할 수있을 때마다 정규 프리미티브를 사용해야한다는 것을 알고 있습니다 .. 예를 들어 BigInteger가 ULong.MaxValue보다 100 배 더 큰 숫자를 위해 설계되었거나 BigInteger가 ULong.MaxValue보다 100k 배 더 큰 숫자를 위해 설계된 것처럼? 나는 그것이 ULong.MaxValue보다 100k 배 더 큰 것을 지원할 수 있다는 것을 알고 있지만이 범위를 염두에두고 설계되었거나이 범위를 "일반 요구 사항"이라고 선언하여 설계 했습니까?
Pacerier

5
BigInteger를 사용하지 않으면 ULong.MaxValue보다 큰 수를 표현할 수 없으므로 그럴 것입니다. ULong.MaxValue보다 커질 수있는 숫자는 BigInteger 여야합니다.
Malfist

물론 BigInteger를 사용하지 않고 ULong.MaxValue보다 큰 숫자를 나타내는 방법이 있습니다. ULong과 boolean 및 viola로 구성된 사용자 정의 구조를 간단히 작성할 수 있습니다. ULong의 최대 두 배를 나타낼 수 있습니다. MaxValue
Pacerier

예, 그러나 BigInteger를 사용하는 것은 덜 복잡하며, 더 빠르면 훨씬 빠르지 않으며 BigInteger만큼 유연하지 않을 수 있습니다. 부울 배열로 매우 큰 숫자를 나타낼 수도 있지만 너무 복잡합니다.
Malfist

2
@Mavrik, 그는 이것을 내가 대답 한 것과 완전히 다른 질문으로 바꿨습니다.
Malfist

4

어떤 의미에서 BigInteger의 포인트는 무제한 정밀도이므로 절대 크기가 아닙니다. 부동 소수점 숫자도 매우 클 수 있지만 정밀도는 제한적입니다. BigInteger를 사용하면 반올림 오류나 오버플로에 대한 걱정없이 산술을 수행 할 수 있습니다. 당신이 지불하는 가격은 일반 정수 또는 부동 소수점 숫자로 산술보다 수백 배 느리다는 것입니다.

다른 사람들이 지적했듯이 ulong은 0에서 18,446,744,073,709,551,615 사이를 유지할 수 있으며 그 범위에 머무르면 정확한 산술을 수행 할 수 있습니다. 해당 범위를 1 이상으로 초과하면 오버플로가 발생하므로 정확한 산술이 필요하고 중간 결과가 18,446,744,073,709,551,615를 초과 할 가능성이있는 경우 질문에 대한 답변은 BigInteger를 사용하는 것입니다.

과학, 공학 및 금융 분야의 대부분의 문제는 부동 소수점 숫자로 인한 근사치와 함께 살 수 있으며 BigInteger 산술의 시간 비용을 감당할 수 없습니다. 대부분의 상업용 계산은 부동 소수점 산술의 근사값을 사용할 수 없지만 0에서 18,446,744,073,709,551,615 범위 내에서 작동하므로 일반 산술을 사용할 수 있습니다. BigInteger는 암호와 같은 것을 포함하는 숫자 이론의 알고리즘을 사용할 때 필요합니다 (50 자리 소수를 생각하십시오). 정확한 계산이 필요하고 속도가 그다지 중요하지 않으며 적절한 고정 소수점 시스템을 설정하는 것이 너무 많은 경우 상용 응용 프로그램에서 종종 사용됩니다.

올바르게 구현 된 경우 BigInteger 산술의 복잡성은 부드러운 곡선이어야합니다. 예를 들어, 곱셈의 시간 복잡도는 O (NM) 여야합니다. 여기서 N은 첫 번째 곱하기의 자릿수이고 M은 두 번째 곱하기의 자릿수입니다. 물론 N과 M을 너무 많이 선택하여 숫자가 기계에 맞지 않을 수 있다는 실질적인 한계가 있습니다.

Google "biginteger의 계산 복잡성"을 사용하면 스틱을 흔들 수있는 것보다 더 많은 참조가 제공됩니다. 귀하의 질문에 직접 대답하는 것은 이것입니다 : 두 개의 임의 정밀 산술 패키지의 비교 .


4

메모리 제한

BigInteger는 스토리지를 위해 int 배열을 사용합니다. 이를 가정하면 BigInteger가 나타낼 수있는 최대 수에 대한 이론적 한계는 .net에서 사용 가능한 최대 배열 크기에서 파생 될 수 있습니다. 배열에 대한 SO 주제가 있습니다 .C #에서 배열에 할당 할 수있는 메모리 양 찾기 .

최대 배열 크기를 알고 있다고 가정하면 BigInteger가 나타낼 수있는 최대 수를 추정 할 수 있습니다. (2 ^ 32) ^ max_array_size, 여기서 :

  • 2 ^ 32-배열 셀의 최대 수 (int)
  • max_array_size-2GB의 객체 크기에 의해 제한되는 int 배열의 최대 허용 크기

이것은 6 억 개의 십진수로 숫자를 제공합니다.

성능 한계

성능과 관련하여 BigInteger는 곱셈에 가라 쓰바 알고리즘 을 사용 하고 더하기에 선형 알고리즘을 사용합니다. 곱셈의 복잡성은 그렇기 3 * n ^ 1.585때문에 많은 수의 경우에도 꽤 잘 확장 되지만 ( 복잡도 그래프 ), RAM 및 프로세서 캐시의 크기에 따라 여전히 성능 저하가 발생할 수 있습니다.

지금까지 최대 수 크기가 2GB로 제한되어 있으므로 하강 머신에서는 예기치 않은 성능 차이가 발생하지 않지만 여전히 6 억 자리 숫자로 작동하면 속도가 느려집니다.


이것은 훌륭한 정보이지만 BigInteger가 int 배열에 의존하는 소스는 어디에 있습니까?
Pacerier

방금 dotPeek을 사용하여 .net 소스를 파헤 쳤습니다. 숫자 자체는 BigInteger 구조의 uint [] _data 안에 저장되어있는 것 같습니다.
Valera Kolupaev

* 더 자세한 답변으로 업데이트되었지만 디 컴파일 된 스 니펫을 제외하고 참조 할 수있는 .net 소스 코드를 찾을 수 없습니다.
Valera Kolupaev

:이 ILSpy에서 파악 될 수 .NET에서의 standart 곱셈 알고리즘이 있다는 것을 날 것으로 보인다 .NET BigInteger를 곱셈
이반 Kochurkin

1

한도는 메모리 크기 (및 보유 시간)입니다. 그래서, 당신은 정말로 큰 숫자를 가질 수 있습니다. Kevin이 말했듯이, 암호화에서 숫자 (1,000)를 이진수로 곱하거나 지수화해야하며 문제없이 가능합니다.

물론, 숫자가 커질수록 알고리즘이 느려지지만 속도는 느려지는 경우가 종종 있습니다.

메가 자리 범위의 숫자를 사용할 때 다른 솔루션에 대해 생각할 수도 있습니다. 실제로 계산하는 것도 느리기 때문입니다.


0

과학계에서는 몇 가지 용도가 있습니다 (예 : 은하 사이의 거리, 잔디밭의 원자 수 등).


어 .. 무례하지는 않지만이 대답은 질문과 어떤 관련이 있습니까?
Pacerier

2
쓰여진 질문은 왜 그런 데이터 유형을 만들어야하는지에 대한 실제 사례를 찾고있는 것처럼 들립니다.
Dave Wise

더 나은 표현은 "BigInteger가 10 ^ 30만큼 큰 숫자에 실제로 적합합니까?"입니다.
Pacerier

이것을 위해 나는 더 잘 사용 double하거나 float-당신은 어쨌든 필요한 정밀도가 없습니다.
Paŭlo Ebermann

더 나은 문구는 "BigInteger가 정밀도가 필요할 때 10 ^ 30의 숫자에 실제로 적합합니까?"입니다.
Pacerier

0

kevin cline의 답변에서 알 수 있듯이 BigNumbers는 많은 현대 암호화 알고리즘 (디지털 서명, 공개 / 개인 키 암호화 등)의 빌딩 블록으로 필요했기 때문에 .NET 라이브러리 primarlily에 추가되었습니다. 현대의 많은 암호화 알고리즘에는 최대 수천 비트 크기의 정수 값에 대한 계산이 포함됩니다. BigNumber 클래스는 잘 정의되고 유용한 클래스를 설명하므로이를 암호화 API의 내부 세부 사항으로 유지하지 않고 공개하기로 결정했습니다.


Btw는 BigNumbers가 .NET 라이브러리에 추가 된 소스가 어디 있는지 궁금합니다. 주로 많은 현대 암호화 알고리즘의 빌딩 블록으로 필요했기 때문입니다 (따라서 최대 수천 비트의 값을 지원할 수 있어야 함)?
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.