2013-09-21 37 views
5

Tại sao việc tăng lên một số nguyên được biểu thị dưới dạng số dấu phẩy động cho các kết quả khác nhau để tăng cùng số ở dạng số nguyên của nó?pow() nâng lên phao

ví dụ .:

>>> pow(10,25)%195 
10L 
>>> pow(10,25.0)%195 
64.0 

Tôi đã cố gắng sử dụng mpmath's power() thay vào đó, nhưng có được con số chính xác cùng - và lỗi - như hình thức thứ hai.

Làm cách nào tôi có thể tăng lên các lũy thừa số nguyên rất lớn và thực hiện sửa đổi chúng (ví dụ: các bước được thực hiện để thực hiện logic giống RSA bằng toán thuần túy) bằng Python?

+2

[Điều mà mỗi nhà khoa học máy tính cần biết về số học dấu chấm động] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – orlp

+0

Tại sao bạn cần điều này? RSA không sử dụng số mũ không phải số nguyên. – Aleph

+0

@AnotherTest vâng tôi chỉ đang nhìn vào biểu mẫu như bị ấn tượng bởi nó giống như RSA, * ngoại trừ * rằng tôi có một số mũ không nguyên. – Will

Trả lời

6

Đối với số nguyên, bạn có thể sử dụng mẫu 3-đối số của pow:

pow(10, 25, 195) 

Vấn đề của bạn ở đây xuất phát từ mất độ chính xác thành bè. Bạn cần phải sử dụng decimal.Decimal s ở đây:

>>> from decimal import Decimal 
>>> pow(10, Decimal('25.0')) % 195 
Decimal('10') 
4

Để trả lời câu hỏi của bạn, bởi vì phao nổi bằng Python là IEEE754 floats and have limited precision.

>>> int(10**25.0) 
10000000000000000905969664L 

Như bạn thấy, câu trả lời là gần nhưng không chính xác.

Làm cách nào tôi có thể nâng cao lên các số nguyên không lớn và thực hiện sửa đổi chúng (ví dụ: các bước thực hiện logic giống RSA bằng toán thuần) trong Python?

Đây là đề nghị của tôi sử dụng x^(a+b) = x^a * x^b:

def powmod_f(base, exponent, mod): 
    return (pow(base, int(exponent), mod) * (base ** (exponent % 1))) % mod 

này chỉ làm việc với một cơ sở nguyên tuy nhiên, nếu cơ sở của bạn là một phao cũng bạn sẽ phải thực hiện một thuật toán powmod mình.