2016-10-13 4 views
1

나는 긍정적 인 C# BigInteger 있습니다. 그것은 매우 클 수 있습니다. 얼마나 큰지에 대한 대략적인 견적을 얻고 싶습니다. 내 추정치가 천분의 일이라고 잘못 해석된다면 괜찮습니다.BigInteger 객체의 크기를 대략적으로 예측할 수 있습니까?

나는 다음을 시도했다. 모든

int est1 = myBigInt.ToByteArray().Count(); 
double est2 = BigInteger.Log10(myBigInt); 
double est3 = BigInteger.Log(myBigInt); 

EDIT slowish (3^1,000,000에 대략 80K 틱)이다 : "크기"란, I는 "수치"의미없는 "메모리 크기."

+4

'double est4 = 1000; 'Quick and rough =) –

+1

진지하게 말하면 개인 배열의 길이에 리플렉션하여 액세스 할 수 있습니다. 리플렉션은 천천히하지만 백만 자리 값을 사용하는 수학 연산보다 확실히 빠릅니다. –

+1

반향에 신경 쓰지 않는다면 'BigInteger.Length (myBigInt._Bits)'가됩니다. 그러나 두 멤버 모두 내부적입니다. 리플렉션을 염두에두고 일종의 상위 범위를 가졌다면'.Log'보다 훨씬 빠른 '.CompareTo'를 사용하여 연속 비교를 시도해 볼 수 있습니다. –

답변

3

먼저 최적화는 직접 Length 속성을 사용할 수 있습니다 byte[], 여기에 LINQ를 방지 ToByteArray() 반환하는 것입니다

int est = myBigInt.ToByteArray().Length; 

이것은, 그러나, 여전히 차선 ToByteArray() 때문에 클론 내부 buffer.For 을 매우 거대한 번호 Reflection을 사용하여 더 나은 장기 성능을 보일 수도 있습니다 :

var bits = typeof(BigInteger).GetField("_bits", 
    BindingFlags.Default | BindingFlags.NonPublic); 
int size = ((uint[])bits.GetValue(myBigInt)).Length * sizeof(uint); 
,451,515,

주 속성 이름과 타입 ... 변경 적절한 단위 테스트 추가 될 다음 상세한 구현되고 내부 버퍼 sizeof(uint) 바이트의 배수이기 때문

은 또한 ( ToByteArray().Length 내부 버퍼가 다를 수 있음을 유의 마지막으로 배열 항목은 내부 Length() 메소드 구현을 참조 비어있을 수 있습니다.)

는 이러한 모든 당신은 +/- 1000X (!) 추정 엄청난 숫자와 협력하지 않는 한 올렉산드르 Pshenychnyy에서 funny comment이 잘못되지 않습니다 말했다 충분하다면 16 바이트 (또는 32 또는 64 ...)의 일정한 크기를 사용할 수 있습니다. 매우 큰 정수를 수용하기에 충분해야합니다 (도 참조하십시오).) ...


+0

Porperty의 이름은 "_Bits"입니다. 하지만 개인 필드 "_ 비트"에 더 잘 액세스 할 수 있습니다. 더러워 지자 =) –

+0

@OleksandrPshenychnyy 맞아, 고쳐! 그들이 구현을 바꿀 때 깨뜨려야한다면 ...;) –