Tìm một số tạo ra tất cả các số nguyên mod q


9

Hãy xem xét các số nguyên modulo qở đâu qlà số nguyên tố, một bộ tạo là bất kỳ số nguyên nào 1 < x < qđể x^1, x^2, ..., x^(q-1)bao gồm tất cả q-1các số nguyên giữa 1q-1. Ví dụ, hãy xem xét các số nguyên modulo 7 (mà chúng tôi viết là Z_7). Sau đó 3, 3^2 mod 7 = 2, 3^3 = 27 mod 7 = 6, 3^4 = 81 mod 7 = 4, 3^5 = 243 mod 7 = 5, 3^6 = 729 mod 7 = 1bao gồm tất cả các giá trị 3, 2, 6, 4, 5, 1bao gồm tất cả các số nguyên 1..6theo yêu cầu.

Nhiệm vụ là viết mã nhận đầu vào nvà đầu ra một trình tạo Z_n. Tất nhiên, bạn không thể sử dụng bất kỳ nội dung hoặc thư viện nào thực hiện điều này cho bạn.

Hạn chế duy nhất về hiệu suất của mã của bạn là bạn phải kiểm tra nó để hoàn thành n = 4257452468389.

Lưu ý rằng 2^n có nghĩa là 2sức mạnh của n. Đó là ^đại diện cho cấp số nhân.


Hmm ... 1 < x < qlàm cho thử thách imo dễ dàng hơn nhiều.
Erik the Outgolfer

@EriktheOutgolfer Tôi không chắc tôi hiểu ý bạn là gì? Đó chỉ là tất cả các số nguyên riêng biệt không phải là 0 hoặc 1.

Ý tôi là nó dễ hơn những gì nhiều người có thể nghĩ ... hoặc có thể là một khoảnh khắc không hoạt động trên PPCG.
Erik the Outgolfer

3
Nhưng tôi nghĩ rằng việc yêu cầu mọi người kiểm tra nó để hoàn thành một số lượng lớn là không cần thiết ... về cơ bản, bộ ba sẽ chỉ là lỗi bộ nhớ.
Erik the Outgolfer

@Lembik Có trường hợp nào không có máy phát cho một số nhất định không? Một số trường hợp thử nghiệm sẽ tốt.
Ông Xcoder

Câu trả lời:


13

Bình thường, 16 15 byte

f-1m.^T/tQdQPtQ

Bộ kiểm tra

Nếu p là đầu vào, chúng ta biết rằng g ^ (p-1) = 1 mod p, vì vậy chúng ta chỉ cần kiểm tra g ^ a! = 1 mod p cho bất kỳ a nhỏ hơn. Nhưng phải là một yếu tố của p-1 để điều đó có thể xảy ra, và bất kỳ bội số nào của a với thuộc tính đó cũng sẽ có thuộc tính đó, vì vậy chúng ta chỉ cần kiểm tra g ^ ((p-1) / q)! = 1 mod p cho tất cả các thừa số nguyên tố q của p - 1. Vì vậy, chúng tôi kiểm tra tất cả các số nguyên g theo thứ tự tăng dần cho đến khi chúng tôi tìm thấy một số nguyên hoạt động.

Giải trình:

f-1m.^T/tQdQPtQ
f                  Return the first value T such that the following is truthy:
            PtQ    Take the prime factorization of the input - 1.
   m               Map those prime factors to
       /tQd        Take the input - 1 divided by the factor
    .^T    Q       Raise T to that exponent mod input,
                   performed as modular exponentiation, for performance.
 -1                Check that 1 is not found among the results.

Khá tuyệt vời!

Mã của bạn thực hiện các yếu tố?

@Lembik Nó làm ( PtQphần).
Erik the Outgolfer


-3
%MATLAB CODE
%Program to generate Z_n for an integer n
n = input('Enter a number to find modulo')
q = input ('Enter a prime number greater than the number you wished to find modulo')
if n>=q 
   fprintf('Error')
   exit(1)
end
for R=1:q-1
    fprintf(rem(n.^R, q))
    fprintf('\n')
end

1
Điều này không giải quyết đúng vấn đề. Mã của bạn, ví dụ, lấy một đầu vào và đưa ra một đầu ra.

1
Ngoài ra, mã này hoàn toàn không phải là golf. Mã golf cần phải càng ngắn càng tốt, vì vậy bạn có thể loại bỏ văn bản đầu vào và khoảng trắng xung quanh bằng các dấu hiệu và như vậy.
Đồng chí SparklePony

3
@ComradeSparklePony Tôi nghĩ rằng vấn đề đầu tiên không giải quyết được vấn đề đúng nên được giải quyết trước :)
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.