Bạn không nên tính toán x^y trực tiếp cho các giá trị lớn của y - như đã được chỉ ra, điều này khá khó thực hiện (mất nhiều không gian và sức mạnh xử lý). Bạn cần phải xem xét các thuật toán giải quyết vấn đề cho bạn với ít hoạt động nhân. Hãy xem: http://en.wikipedia.org/wiki/Exponentiation_by_squaring để bắt đầu.
Độ lớn mô đun cũng được hiểu rõ: http://en.wikipedia.org/wiki/Modular_exponentiation.
Bạn sẽ cần sử dụng thư viện python cho số lớn, chẳng hạn như http://gmpy.sourceforge.net/.
Nếu có bất kỳ trợ giúp nào, tôi đã tính lũy thừa mô đun trong C bằng cách sử dụng mpir. Tôi sẽ đính kèm mã đó, bạn sẽ cần phải chuyển đổi nó thành python của khóa học.
int power_modn(mpz_t c, mpz_t b, mpz_t e, mpz_t n)
{
mpz_t result;
mpz_t one;
mpz_t r;
mpz_t modulus; mpz_t exponent; mpz_t base;
mpz_init(modulus); mpz_init(exponent); mpz_init(base);
mpz_init(result); mpz_init(one); mpz_init(r);
mpz_set_ui(result, 1);
mpz_set_ui(one, 1);
mpz_set(base, b);
mpz_set(exponent, e);
mpz_set(modulus, n);
while (mpz_cmp_ui(exponent, 0) > 0)
{
if (mpz_mod_ui(r, exponent, 2) == 1)
{
mpz_mul(result, result, base);
mpz_mod(result, result, modulus);
};
mpz_mul(base, base, base);
mpz_mod(base, base, modulus);
mpz_fdiv_q_ui(exponent, exponent, 2);
}
mpz_set(c, result);
return 0;
}
Nguồn
2010-03-06 11:20:35
Bạn có cần dùng mô-đun sau đó không? – kennytm
Mật mã _is_ phức tạp và thực sự không có lý do gì để hét lên. Hãy thử Googling "Numpy". Và nếu nó quan trọng, đừng tự mình làm mật mã. – stefanw