Python, 76 73 67 ไบต์
f=lambda n,k=1:1-any(a**-~k*~-a**k%n for a in range(n))or-~f(n,k+1)
ลองออนไลน์!
ไบต์ต่อไปอาจจะถูกบันทึกไว้โดยการกลับทรูแทน1
การใช้ทางเลือก
การใช้วิธีการเดียวกันนี้ยังมีการใช้งานต่อไปนี้โดย @feersum ซึ่งไม่ได้ใช้ความเข้าใจในรายการ
f=lambda n,k=1,a=1:a/n or(a**-~k*~-a**k%n<1)*f(n,k,a+1)or-~f(n,k+1)
โปรดทราบว่าการดำเนินการนี้ต้องใช้O (n λ (n) )เวลา ประสิทธิภาพอาจจะดีขึ้นอย่างมากในขณะที่จริงลดลงคะแนนไป66 ไบต์แต่ฟังก์ชั่นจะกลับมาทรูสำหรับใส่2
f=lambda n,k=1,a=1:a/n or~-a**k*a**-~k%n<1==f(n,k,a+1)or-~f(n,k+1)
พื้นหลัง
คำจำกัดความและสัญลักษณ์
ตัวแปรที่ใช้ทั้งหมดจะแสดงถึงจำนวนเต็ม n , kและαจะแสดงในเชิงบวกจำนวนเต็ม; และหน้าจะแสดงเป็นบวกที่สำคัญ
a | ขถ้าขคือหารด้วยคือถ้ามีคิวดังกล่าวว่าข = QA
≡ข ( modเมตร)ถ้าและBมีเหมือนกันตกค้าง modulo เมตรเช่นถ้าม | a - b
λ (n)เป็นที่เล็กที่สุดkดังกล่าวว่าk ≡ 1 ( mod n) - คือเช่นว่าn | k - 1 - สำหรับทุกที่มี coprime เพื่อn
f (n)เป็นที่เล็กที่สุดkดังกล่าวว่า2k + 1 ≡ k + 1 ( mod n) - คือเช่นว่าn | k + 1 (กk - 1) - สำหรับทุก
λ (n) ≤ f (n)
แก้ไขnและให้พ.ศ. coprime เพื่อn
โดยนิยามของf , n | f (n) 1 (กf (n) - 1) ตั้งแต่และnไม่ได้มีปัจจัยสำคัญที่พบบ่อยและก็ไม่f (n) 1และnซึ่งหมายความว่าn | f (n) - 1
เนื่องจากλ (n)เป็นจำนวนเต็มที่น้อยที่สุดkดังนั้นn | k - 1สำหรับจำนวนเต็มทั้งหมดที่มี coprime เพื่อnมันตามที่λ (n) ≤ f (n)
λ (n) = f (n)
เนื่องจากเราได้สร้างความไม่เท่าเทียมกันแล้วλ (n) ≤ f (n)มันก็เพียงพอแล้วที่จะตรวจสอบว่าk = λ (n)เป็นไปตามเงื่อนไขที่กำหนดfคือ ie | λ (n) 1 (กλ (n) - 1)สำหรับทุก เพื่อจุดประสงค์นี้เราจะสร้างp α | a λ (n) +1 (a λ (n) - 1)เมื่อใดก็ตามที่p α | n .
λ (k) | λ (n)เมื่อใดก็ตามที่k | n ( แหล่งที่มา ) ดังนั้น(a λ (k) - 1) (a λ (n) -λ (k) + a λ (n) -2λ (k) + ⋯ + a λ (k) + 1) = a λ (n) - 1และดังนั้นa λ (k) - 1 | a λ (n) - 1 | λ (n) 1 (กλ (n) - 1)
หากและP αมี coprime โดยความหมายของλและข้างต้นP α | a λ (p α ) - 1 | a λ (n) +1 (a λ (n) - 1)ติดตามตามที่ต้องการ
ถ้าa = 0ดังนั้นa λ (n) +1 (a λ (n) - 1) = 0ซึ่งหารด้วยจำนวนเต็มทั้งหมด
ในที่สุดเราต้องพิจารณากรณีที่aและp αมีปัจจัยสำคัญร่วมกัน เนื่องจากpเป็นนายกนี่ก็หมายความว่าp | ก . ทฤษฎีบทของคาร์ไมเคิลกำหนดว่าλ (p α ) = (p - 1) p α - 1ถ้าp> 2หรือα <3และλ (p α ) = p α - 2 เป็นอย่างอื่น ในทุกกรณีλ (P α ) ≥ P α - 2 ≥ 2 α - 2 > α - 2
ดังนั้นλ (n) + 1 ≥λ (p α ) + 1> α - 1ดังนั้นλ (n) + 1 ≥αและp α | p λ (n) +1 | a λ (n) +1 | λ (n) 1 (กλ (n) - 1) นี่เป็นการพิสูจน์ที่สมบูรณ์
มันทำงานอย่างไร
ในขณะที่คำจำกัดความของf (n)และλ (n)พิจารณาค่าที่เป็นไปได้ทั้งหมดของมันจะเพียงพอที่จะทดสอบผู้ที่โกหกใน[0, ... , n - 1]
เมื่อf (n, k)จะเรียกว่ามันคำนวณk + 1 (กk - 1) n%สำหรับค่าทั้งหมดของในช่วงนั้นซึ่งเป็น0ถ้าหากว่าn | k + 1 (กk - 1)
หากตกค้างคำนวณทั้งหมดเป็นศูนย์K = λ (n)และany
ผลตอบแทนที่เป็นเท็จดังนั้นf (n, k)ผลตอบแทนที่1
บนมืออื่น ๆ ในขณะที่k <λ (n) , 1-any(...)
จะกลับ0ดังนั้นฉเรียกว่าซ้ำมีมูลค่าเพิ่มขึ้นของk การนำหน้าจะ-~
เพิ่มค่าส่งคืนของf (n, k + 1)ดังนั้นเราจึงเพิ่ม1ถึงf (n, λ (n)) = 1หนึ่งครั้งสำหรับทุกจำนวนเต็มใน[1, ... , λ (n) - 1 ] . ผลสุดท้ายจึงλ (n)