Nice programing

C #의 큰 정수

nicepro 2020. 11. 21. 09:18
반응형

C #의 큰 정수


현재 여기에 설명 된대로 J # 라이브러리에서 차용 java.math.BigInteger하고 있습니다 . 이전에 큰 정수로 작업하기 위해 라이브러리를 사용한 적이 없었기 때문에 ulong길이 숫자의 경우에도 10 배 정도 느려진 것 같습니다 . 누구든지 더 나은 (가급적 무료) 라이브러리가 있습니까? 아니면이 수준의 성능이 정상입니까?


.NET 4.0부터 System.Numerics.BigInteger 클래스를 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.numerics.biginteger(v=vs.110).aspx에서 설명서를 참조하십시오.

또 다른 대안은 IntX 클래스입니다.

IntX는 빠른-O (N * log N)-곱셈 / 나눗셈 알고리즘 구현으로 순수 C # 2.0으로 작성된 임의 정밀도 정수 라이브러리입니다. 더하기, 곱하기, 비교, 비트 이동 등과 같은 정수에 대한 모든 기본 작업을 제공합니다.


F#또한 하나와 함께 배송됩니다. 에서 얻을 수 있습니다 Microsoft.FSharp.Math.


System.Numerics.BigInteger.NET 4.0 클래스는 Microsoft.SolverFoundation.Common.BigIntegerMicrosoft Research를 기반으로 합니다.

Solver Foundation의 BigInteger수업은 매우 훌륭해 보입니다. 어떤 라이선스로 출시되었는지 확실하지 않지만 여기에서 얻을 수 있습니다 (Solver Foundation을 다운로드하여 설치하고 Microsoft.Solver.Foundation.dll을 찾습니다).


네이티브 유형에서 네이티브 유형 (예 : int64)보다 작은 결과를 반환 할 BigInts에서 모든 작업을 수행하고 오버플로 할 경우에만 큰 배열을 처리하면 구현을 최적화 할 수 있다고 생각합니다.

edit codeproject 에서이 구현은 7 배 느려 보이지만 위의 최적화를 사용하면 작은 수의 네이티브 유형과 거의 동일하게 수행 할 수 있습니다.


다음은 C #에서 BigInteger의 몇 가지 구현입니다. Mono의 BigInteger 구현을 사용했으며 매우 빠르게 작동합니다 (CompactFramework에서 사용했습니다).

바운시 캐슬

단 핵증


성능에 대해서는 잘 모르겠지만 IronPython에는 BigInteger 클래스도 있습니다. Microsoft.Scripting.Math 네임 스페이스에 있습니다.


예, 느릴 것이고 10 배의 차이는 제가 기대했던 것입니다. BigInt는 배열을 사용하여 임의의 길이를 나타내며 모든 연산은 수동으로 수행해야합니다 (CPU로 직접 수행 할 수있는 대부분의 수학과는 반대).

어셈블리에서 직접 코딩하면 10 배 이상의 성능 향상을 얻을 수 있는지도 모르겠습니다. 나는 그것을 최적화하는 다른 방법을 찾고 싶습니다. 때로는 수학 문제에 따라 더 빨리 만들 수있는 약간의 트릭이 있습니다.


이전 직장에서 Biginteger사용 했습니다 . 어떤 성능이 필요한지 모르겠습니다. 성능 집약적 인 상황에서 사용하지 않았지만 문제가 없었습니다.


이것은 이상한 제안처럼 들릴 수 있지만 얼마나 빨리 작동하는지 확인하기 위해 십진수 유형을 테스트 했습니까?

소수점 범위는 ± 1.0 × 10 ^ −28 ~ ± 7.9 × 10 ^ 28이므로 여전히 충분히 크지는 않지만 ulong보다 큽니다.

.NET 3.5에는 BigInteger 클래스가 있어야했지만 잘 렸습니다 .


이것은 도움이되지 않지만 .Net 3.5에 BigInteger 클래스가 있어야했습니다. 잘 렸지만 PDC에서 작성한 진술에서는 .Net 4.0에있을 것입니다. 그들은 분명히 그것을 최적화하는 데 많은 시간을 보냈으므로 성능은 지금 얻는 것보다 훨씬 나아질 것입니다.

또한이 질문은 본질적 으로 .NET에서 매우 큰 정수어떻게 나타낼 수 있습니까?


스레드 의 답변을 참조하십시오 . 사용 가능한 타사 큰 정수 라이브러리 / 클래스 중 하나를 사용하거나 네이티브 BigInteger 데이터 유형을 포함 할 C # 4.0을 기다려야합니다.


이것은 매우 유망 해 보입니다. GMP 이상의 C # 래퍼 입니다.

http://web.rememberingemil.org/Projects/GnuMpDotNet/GnuMpDotNet.html

닷넷 다른 BigInteger를 옵션도 있습니다 여기에 특히 Mpir.Net


내가 작성한 Math.Gmp.Native Nuget 패키지를 사용할 수도 있습니다 . 소스 코드는 GitHub 에서 사용할 수 있으며 문서는 여기에서 사용할 수 있습니다 . 고도로 최적화 된 임의 정밀도 산술 라이브러리로 알려진 GMP 라이브러리 의 모든 기능을 .NET에 노출합니다 .

임의의 정밀도 정수는 mpz_t 유형으로 표시됩니다 . 이 정수에 대한 연산은 모두 mpz_접두사로 시작 합니다. 예를 들어 mpz_add 또는 mpz_cmp 입니다. 각 작업에 대한 소스 코드 예제가 제공됩니다.

참고 URL : https://stackoverflow.com/questions/176775/big-integers-in-c-sharp

반응형