Làm thế nào để kiểm tra nếu một số là một sức mạnh hoàn hảo trong thời gian đa thức


23

Bước đầu tiên của thuật toán kiểm tra tính nguyên thủy của AKS là kiểm tra xem số đầu vào có phải là một công suất hoàn hảo hay không. Có vẻ như đây là một thực tế nổi tiếng trong lý thuyết số vì bài báo không giải thích chi tiết. Ai đó có thể cho tôi biết làm thế nào để làm điều này trong thời gian đa thức? Cảm ơn.


7
Bước đầu tiên của thuật toán AKS là kiểm tra xem số đầu vào có phải là công suất hoàn hảo hay không (một số dạng đối với một số số nguyên c, n> 1), khác với việc kiểm tra xem số đó có phải là công suất chính hay không. Bài kiểm tra cho một sức mạnh hoàn hảo là Bài tập 9,44 của cuốn sách được trích dẫn trong bài báo ( Đại số máy tính hiện đại của von zur Gathen và Gerhard, 2003). Tôi chưa đọc cuốn sách và tôi không biết câu trả lời, nhưng bạn đã tham khảo cuốn sách chưa? cn
Tsuyoshi Ito

1
Tôi tin rằng bước đầu tiên của AKS kiểm tra xem số đó có phải là lũy thừa của một số nguyên dương không, không nhất thiết phải là số nguyên tố. Nếu nó được biết làm thế nào để kiểm tra một công suất nguyên tố trong thời gian đa thức trước AKS, thì điều đó đã đưa ra một thử nghiệm nguyên thủy thời gian đa thức.
arnab

@Tsuyoshi Cảm ơn bạn đã chỉ ra sai lầm của tôi. Tôi đã không tham khảo cuốn sách.
yzll

2
Nếu bạn quan tâm đến câu hỏi , hãy cố gắng giải quyết vấn đề trước khi bạn đăng nó.
Tsuyoshi Ito

Tsuyoshi / arnab, có lẽ bạn nên đăng lại như câu trả lời để điều này có thể được chấp nhận?
Suresh Venkat

Câu trả lời:


31

Cho một số n, nếu ở tất cả nó có thể được viết như (b> 1), sau đó b < log ( n ) + 1 . Và đối với mỗi cố định b , kiểm tra nếu có tồn tại một một với một b = n có thể được thực hiện sử dụng tìm kiếm nhị phân. Do đó, tổng thời gian chạy là O ( log 2 n ) tôi đoán.abb<log(n)+1baab=nO(log2n)


5
Câu trả lời của Ramprasad bỏ thời gian để thực hiện phép lũy thừa là . Một cách khác là chọn b sau đó tính toán gốc b của n sẽ có tổng thời gian là O ( l o g 3 n ) . O(log3n)bbnO(log3n)
David Marquis

1
Một cải tiến đơn giản giúp loại bỏ thêm yếu tố bằng cách chỉ chọn nguyên tố b . loglognb
Chao Xu

16

Xem Bach và Sorenson, Sàng thuật toán để kiểm tra sức mạnh hoàn hảo, Thuật toán 9 (1993), 313-328, DOI: 10.1007 / BF01228507 và DJ Bernstein, Phát hiện sức mạnh hoàn hảo trong thời gian tuyến tính, Toán học. Comp. 67 (1998), 1253-1283.


Ngoài ra còn có một bài báo tiếp theo với thời gian chạy không triệu chứng được cải thiện và điều trị đơn giản hơn: DJ Bernstein, HW Lenstra Jr. và J. Pila, Phát hiện sức mạnh hoàn hảo bằng cách bao thanh toán vào các bản sao, Toán học. Comp. 76 (2007), 385 Kho388.
Erick Wong

3

Tôi đã tìm thấy một giải pháp thú vị và tao nhã trong bài báo: Về việc thực hiện bài kiểm tra tính nguyên thủy của lớp AKS, bởi R.Crandall và J.Papadopoulos, 18/03/2003.


2

Bằng cách nào đó, tôi có thể thấy rằng các thuật toán tìm kiếm nhị phân là .O(lg n(lg lg n)2)

Thứ nhất, , có b < l g n . Thuật toán tìm kiếm nhị phân: Với mỗi b , chúng tôi sử dụng tìm kiếm nhị phân để tìm a .ab=nb<lg n
ba

Mỗi lần tính toán của chi phí l g b = l g l g n hoạt động bằng cách sử dụng lũy thừa nhanh . Do đó, vấn đề còn lại là phạm vi của a .ablg b=lg lg na

Nếu là giá trị tối đa có thể có của a , thì tìm kiếm nhị phân cần l g A hoạt độngAalg A

Lưu ý rằng , đó là l g A = l g nb tôig một= =tôig n Khi tổng hợp, ΣlgMột=lgn(1

tôig Một= =tôig nb
Σtôig Một= =tôig n(11+12+...+1B)= =tôig ntôig B= =tôig ntôig tôig n

Ôi(tôig ntôig tôig n)

mộtbÔi(tôig n(tôig tôig n)2)

ps: Tất cả các lg là cơ sở 2.

Mã Python:

#--- a^n ---------------------------------------
def fast_exponentation(a, n):
    ans = 1
    while n:
        if n & 1 : ans = ans * a
        a = a * a
        n >>= 1
    return ans
#------------------------------------------
# Determines whether n is a power a ^ b, O(lg n (lg lg n) ^ 2)
def is_power(n):
    if (- n & n) == n: return True  # 2 ^ k
    lgn = 1 + ( len( bin ( abs ( n ) ) ) - 2)
    for b in range(2,lgn):
        # b lg a = lg n
        lowa = 1L
        higha = 1L << (lgn / b + 1)
        while lowa < higha - 1:
            mida = (lowa + higha) >> 1
            ab = fast_exponentation(mida,b) 
            if ab > n:   higha = mida
            elif ab < n: lowa  = mida
            else:   return True # mida ^ b
    return False
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.