ค้นหาตัวเลขที่สร้างจำนวนเต็ม mod q


9

พิจารณาจำนวนเต็มแบบโมดูโลqที่qเป็นนายกกำเนิดเป็นจำนวนเต็มใด ๆ1 < x < qเพื่อให้x^1, x^2, ..., x^(q-1)ครอบคลุมทั้งหมดq-1ของจำนวนเต็มระหว่างและ1 q-1ตัวอย่างเช่นพิจารณาจำนวนเต็มโมดูโล 7 (ซึ่งเราเขียนเป็นZ_7) จากนั้น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 = 1ครอบคลุมค่า3, 2, 6, 4, 5, 1ทั้งหมดครอบคลุมจำนวนเต็มทั้งหมด1..6ตามต้องการ

งานคือการเขียนโค้ดที่ใช้เวลาการป้อนข้อมูลและผลเครื่องกำเนิดไฟฟ้าสำหรับn Z_nคุณไม่สามารถใช้ builtin หรือไลบรารี่ที่ทำเพื่อคุณได้แน่นอน

ข้อ จำกัด n = 4257452468389เฉพาะในการปฏิบัติงานของรหัสของคุณคือการที่คุณจะต้องมีการทดสอบที่จะเสร็จสิ้นด้วย

โปรดทราบว่า2^n หมายถึงการขึ้นสู่อำนาจของ2 nนั่น^หมายถึงการยกกำลัง


อืม ... 1 < x < qทำให้การท้าทายเป็นเรื่องง่ายขึ้นมาก
Erik the Outgolfer

@EriktheOutgolfer ฉันไม่แน่ใจว่าฉันรู้ว่าคุณหมายถึงอะไร? นี่เป็นเพียงจำนวนเต็มทั้งหมดที่ไม่ใช่ 0 หรือ 1

ฉันหมายความว่ามันง่ายกว่าที่หลายคนอาจคิดว่า ... หรือบางช่วงเวลาที่ไม่ได้ใช้งานบน PPCG
Erik the Outgolfer

3
แต่ฉันคิดว่าการที่ผู้คนต้องทดสอบให้เสร็จเป็นจำนวนมากนั้นไม่จำเป็น ... โดยทั่วไป tio จะเป็นแค่หน่วยความจำผิดพลาด
Erik the Outgolfer

@ Lembik มีกรณีที่ไม่มีเครื่องกำเนิดไฟฟ้าสำหรับจำนวนหนึ่งหรือไม่? บางกรณีทดสอบจะดี
Mr. Xcoder

คำตอบ:


13

Pyth, 16 15 ไบต์

f-1m.^T/tQdQPtQ

ชุดทดสอบ

ถ้า p คืออินพุตเรารู้ว่า g ^ (p-1) = 1 mod p ดังนั้นเราต้องตรวจสอบว่า g ^ a! = 1 mod p สำหรับ a ที่เล็กกว่า แต่ต้องเป็นปัจจัยของ p-1 เพื่อให้เป็นไปได้และ a ใด ๆ ของ a ที่มีคุณสมบัตินั้นจะมีคุณสมบัตินั้นด้วยดังนั้นเราต้องตรวจสอบว่า g ^ ((p-1) / q)! = 1 mod p สำหรับปัจจัยหลักทั้งหมด q ของ p-1 ดังนั้นเราจะตรวจสอบจำนวนเต็มทั้งหมดในลำดับที่เพิ่มขึ้นจนกว่าเราจะพบสิ่งที่ใช้ได้

คำอธิบาย:

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.

น่ากลัวมาก!

รหัสของคุณมีการแยกตัวประกอบหรือไม่?

@ Lembik มัน ( PtQส่วนหนึ่ง)
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
นี่ไม่ได้เป็นการแก้ปัญหาที่ถูกต้อง ตัวอย่างเช่นรหัสของคุณควรรับหนึ่งอินพุตและให้เอาต์พุตหนึ่งรายการ

1
นอกจากนี้รหัสนี้ไม่ได้เล่นกอล์ฟเลย รหัส Golfed จะต้องสั้นที่สุดเท่าที่จะเป็นไปได้ดังนั้นคุณสามารถลบข้อความอินพุตและช่องว่างรอบ ๆ เครื่องหมายเท่ากับได้
สหาย SparklePony

3
@ComputSparklePony ฉันคิดว่าปัญหาแรกที่ไม่ได้แก้ปัญหาที่ถูกต้องควรแก้ไขก่อน :)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.