2011-01-03 22 views
15

Tôi đang chơi với các số trong Java và muốn xem số lượng lớn mà tôi có thể thực hiện. Đó là sự hiểu biết của tôi rằng BigInteger có thể giữ một số kích thước vô hạn, miễn là máy tính của tôi có đủ bộ nhớ để giữ một số như vậy, đúng không?BigInteger.pow (BigInteger)?

Vấn đề của tôi là BigInteger.pow chỉ chấp nhận một int, không phải BigInteger khác, có nghĩa là tôi chỉ có thể sử dụng một số lên tới 2.147.483.647 làm số mũ. Có thể sử dụng lớp BigInteger như vậy không?

BigInteger.pow(BigInteger) 

Cảm ơn.

+0

'BigInteger' không thể đại diện cho số lượng kích thước vô hạn, nó chỉ có thể đại diện cho số" gần "kích thước tùy ý. Số đại diện tối đa tùy thuộc vào việc triển khai của bạn (cấu trúc dữ liệu nội bộ) và bộ nhớ heap có sẵn. –

+0

tại sao bạn cần? Giống như Saeed nói dưới đây thậm chí còn nhỏ nhất như vậy giá trị mà int là không đủ là quá lớn ... – Fakrudeen

+0

Nó chỉ có ý nghĩa khi bạn tính toán modulo một 'BigInteger', cho trường hợp đó nó tồn tại: http://download.oracle.com/javase /6/docs/api/java/math/BigInteger.html#modPow(java.math.BigInteger,%20java.math.BigInteger) – starblue

Trả lời

1

java sẽ không cho phép bạn thực hiện BigInteger.Pow (BigInteger) nhưng bạn có thể đặt nó vào số nguyên tối đa trong một vòng lặp và xem nơi một ArithmeticException được ném hoặc một số lỗi khác do hết bộ nhớ.

2

2^2,147,483,647 có ít nhất 500000000 chữ số, trên thực tế, tính toán pow là vấn đề NPC, [Pow là NPC với độ dài đầu vào, 2 đầu vào (m, n). và có thể mất tối đa nlog (m) (cuối cùng câu trả lời mất n log (m) không gian) mà không phải là quan hệ đa thức giữa đầu vào và kích thước tính toán], có một số vấn đề đơn giản không dễ thực tế ví dụ sqrt(2) của chúng, bạn không thể xác định độ chính xác thực (tất cả các precisions), tức là BigDecimal nói có thể tính toán tất cả các precisions nhưng nó không thể (trên thực tế) vì không ai giải quyết điều này cho đến bây giờ.

+0

@ Fakrudeen, Đó là NPC trong không gian. –

+0

Công suất máy tính không phải là NPC. Nó rất đa thức. Đối với một ví dụ algo. xem câu trả lời của Keith. Tính n^m là cực đại (mlogn)^2 * logm, rõ ràng là nhỏ hơn (max (n, m))^4. Ngoài ra định nghĩa của bạn về NPC là không chính xác. NPC có nghĩa là bạn có thể xác minh câu trả lời trong thời gian đa thức, nhưng giải pháp là NP cứng (đa thức trong mô hình TM không xác định). – Fakrudeen

+0

NPC trong không gian sẽ ngụ ý ít nhất NPC trong thời gian, Bởi vì sử dụng hết không gian đó sẽ mất nhiều thời gian NPC! – Fakrudeen

17

Bạn có thể viết riêng của bạn, sử dụng repeated squaring:

BigInteger pow(BigInteger base, BigInteger exponent) { 
    BigInteger result = BigInteger.ONE; 
    while (exponent.signum() > 0) { 
    if (exponent.testBit(0)) result = result.multiply(base); 
    base = base.multiply(base); 
    exponent = exponent.shiftRight(1); 
    } 
    return result; 
} 

có thể không làm việc cho các cơ sở tiêu cực hoặc số mũ.

+1

+1 cho thấy rằng nó có thể (mặc dù nó có thể không phải là một ý tưởng tốt) –

+0

@ Patrick Patrick Floyd, @Keith Randall, Có thể viết mã đơn giản như thế này nhưng nó không thể sử dụng nó, việc sử dụng của số nguyên lớn coef trong trường hợp này là gì ????? bạn đã có thể sử dụng một loạt các số nguyên lớn mà không phải là int ????? Mã này chỉ là sl ow, bởi vì biginteger là rất chậm hơn so với int. –

+1

Có, nó sẽ khá chậm và có lẽ không hữu ích lắm. Nhưng nó trả lời câu hỏi của OP về cách kiểm tra BigInteger lớn đến mức nào. Và cùng một thuật toán là hữu ích khi sử dụng số học mô-đun - xem BigInteger.modPow, mà có một số mũ BigInteger. –

6

Triển khai cơ bản của BigInteger được giới hạn ở (2^31-1) * giá trị 32 bit. gần như là 2^36 bit. Bạn sẽ cần 8 GB bộ nhớ để lưu trữ và nhiều lần lần này để thực hiện bất kỳ thao tác nào trên nó như toString().

BTW: Bạn sẽ không bao giờ có thể đọc số đó. Nếu bạn cố in nó ra thì sẽ mất một thời gian để đọc nó.

+0

cộng một cho phần "BTW" ... chỉ là một câu hỏi nữa, còn nếu tôi chỉ lưu trữ BigInteger "BIG" như vậy trong biến kiểu BigInteger thì sao? Tôi đã làm nó, chia nó với một BigInteger khác và cố gắng lấy phần còn lại. Sau đó, tôi đã cố gắng để in phần còn lại, nhưng giao diện điều khiển là dành quá nhiều thời gian để hiển thị phần còn lại. – Mukit09

+0

@ Mukit09 nếu tất cả những gì bạn cần là phần còn lại và đó là tương đối nhỏ, rất có thể nó là hiệu quả hơn để chỉ tính phần còn lại thay vì giá trị lớn. ví dụ. 'pow' có thể rất đắt nhưng' modPow' có thể nhanh hơn đáng kể. Lưu ý: bàn giao tiếp điều khiển DOS rất chậm. Thay vào đó, hãy thử viết số vào tệp. –

+0

cảm ơn câu trả lời của bạn. Vấn đề của tôi đã được giải quyết, nhưng bây giờ tôi muốn biết sự thật. Khi tôi cố gắng lưu trữ BIG BigInteger như vậy trong một biến, tôi đoán, đó là một vấn đề quá, như RAM của tôi không thể cung cấp cho không gian như vậy để biến đó. Bạn vui lòng cho tôi biết nếu tôi sai? Bộ nhớ – Mukit09

8

Bạn chỉ có thể làm điều này trong Java bởi số học modula, có nghĩa là bạn có thể làm một a^b mod c, nơi a, b, cBigInteger số.

này được thực hiện sử dụng:

BigInteger modPow(BigInteger exponent, BigInteger m) 

Read the BigInteger.modPow documentation here.

-4

Chỉ cần sử dụng .intValue() Nếu BigInteger của bạn được đặt tên BigValue2, sau đó nó sẽ là BigValue2.intValue()

Vì vậy, để trả lời câu hỏi của bạn, đó là

BigValue1.pow(BigValue2.intValue()) 
+0

Không tăng anh ta hạn chế OP đang hỏi về. – EJP

0

tôi có thể đề nghị bạn tận dụng BigInteger modPow (BigInteger mũ, BigInteger m)

Giả sử bạn có BigInteger X, và BigInteger Y và bạn muốn tính BigInteger Z = X^Y.

Nhận một thủ lớn P >>>> X^Y và làm Z = X.modPow (Y, P);

Các vấn đề liên quan