ตีกอล์ฟหลอก!


9

บทนำ / ความเป็นมา

ในการสนทนาเมื่อเร็ว ๆ นี้ในการแชท cryptoฉันถูกท้าทายให้พูดคุย / ช่วยเหลือเกี่ยวกับการทดสอบแบบดั้งเดิมของแฟร์มาต์และหมายเลขคาร์ไมเคิล การทดสอบนี้ขึ้นอยู่กับสถานที่ตั้งที่a^(p-1) mod p==1จะถือเป็นช่วงเวลาpเสมอ แต่ไม่เสมอไปสำหรับคอมโพสิต ขณะนี้จำนวน Carmichael เป็นหลักทดสอบศัตรูที่เลวร้ายที่สุดของแฟร์มาต์: จำนวนที่คุณต้องเลือกaที่จะไม่ร่วมกับนายกรัฐมนตรีที่จะได้รับp a^(p-1) mod p!=1ทีนี้ถ้าaไม่ใช่เพื่อนร่วมคุณก็พบว่าปัจจัยที่ไม่ใช่เรื่องไร้สาระpและอย่างที่เราทุกคนรู้ว่าแฟคตอริ่งนั้นค่อนข้างยาก โดยเฉพาะอย่างยิ่งหากปัจจัยทั้งหมดมีขนาดใหญ่พอสมควร ตอนนี้คุณอาจรู้ว่าทำไมการทดสอบแฟร์มาต์ไม่ได้ถูกใช้ในทางปฏิบัติบ่อยครั้ง (มีอัลกอริธึมที่ดีกว่า) เนื่องจากมีตัวเลขที่คุณเป็นผู้พิทักษ์ ผู้โจมตี (คือปัจจัยจำนวน)

ตอนนี้เรารู้แล้วว่าทำไมตัวเลขเหล่านี้ถึงน่าสนใจเราจะสร้างมันขึ้นมาให้สั้นที่สุดเท่าที่จะเป็นไปได้ดังนั้นเราสามารถจำรหัสการสร้างได้หากเราต้องการ!

หมายเลขร์ไมเคิลยังเป็นที่รู้จักA002997 ใน OEIS
มีความท้าทายที่เกี่ยวข้องอยู่แล้ว แต่รายการจากที่นั่นไม่สามารถแข่งขันได้ที่นี่เพราะสิ่งเหล่านี้ได้รับการปรับให้เหมาะสมกับความเร็วเมื่อเทียบกับขนาด อาร์กิวเมนต์เดียวกันถือสำหรับทิศทางผกผันรายการที่นี่มีแนวโน้มที่จะทำให้การแลกเปลี่ยนกับความเร็วในความโปรดปรานของขนาด

สเปค

อินพุต

นี่คือมาตรฐาน ความท้าทายดังนั้นคุณจึงใช้จำนวนเต็มบวกหรือไม่ใช่ลบnเป็นอินพุต nอาจเป็นดัชนี 0- หรือ 1 ตามที่คุณต้องการ (โปรดระบุ)

เอาท์พุต

ผลลัพธ์ของคุณอาจเป็นnหมายเลข -m carmichael หรือnหมายเลข carmichael แรกตามที่คุณต้องการ (โปรดระบุ)

สเปค

จำนวนเต็มxคือจำนวนคาร์ไมเคิถ้าหากxเป็นคอมโพสิตและสำหรับจำนวนเต็มทั้งหมดyที่มีก็ถือได้ว่าgcd(x,y)=1y^(x-1) mod x==1

ใครชนะ?

นี่คือ ดังนั้นรหัสที่สั้นที่สุดในไบต์ชนะ!
ใช้กฎ IO มาตรฐานและช่องโหว่

กรณีทดสอบ

ตัวเลข carmichael สองสามตัวแรกคือ:

 561,1105,1729,2465,2821,6601,8911,10585,15841,
 29341,41041,46657,52633,62745,63973,75361,101101,
 115921,126217,162401,172081,188461,252601,278545,
 294409,314821,334153,340561,399001,410041,449065,
 488881,512461

คำตอบ:


8

Mathematica, 71 ไบต์

(t=s=1;While[t<=#,If[++s~Mod~CarmichaelLambda@s==1&&!PrimeQ@s,t++]];s)&  

ลองออนไลน์!

50->1461241 ลองออนไลน์!


4
Mathematica อยู่ใน TiO แล้วดังนั้นหากใครสนใจคุณก็ลองออนไลน์ได้!
Mr. Xcoder

@ Mr.Xcoder เฮ้เยี่ยมมาก! ฉันเพิ่ม mathematica TIO
J42161217

6

Python 2 , 92 ไบต์

f=lambda j,n=1:j and f(j-([(k/n)**~-n%n for k in range(n*n)if k/n*k%n==1]<[1]*~-n),n+1)or~-n

ลองออนไลน์!

ดัชนี 1 และช้าเป็นกากน้ำตาล

ในความเข้าใจของรายการผมใช้วิธีเดนนิสสำหรับการสร้างจำนวนเต็มทั้งหมด coprime ไปn (n ของtotatives ) แล้วผมคำนวณx**~-n%nสำหรับพวกเขาทั้งหมด เรียกรายการนี้Lกัน

เพื่อตรวจสอบจำนวนคาร์ไมเคิผมเปรียบเทียบรายการนี้lexicographicallyไปยังรายการที่ประกอบด้วยn-1คน ทำไมจึงใช้งานได้

แต่ละองค์ประกอบของLเป็นจำนวนเต็มบวก: (k/n)เป็น coprime ถึงnดังนั้น(k/n)**~-nก็เช่น(k/n)**~-n%n > 0กัน ดังนั้นค่าที่เป็นไปเพียงคนเดียวLที่มี lexicographically น้อยกว่า [1]*(n-1)เป็นคนที่ประกอบด้วยทั้งน้อยกว่า n-1คน ( Lไม่สามารถมีมากขึ้นกว่าn-1ค่าเช่นnไม่สามารถมีมากกว่าn-1totatives ดังนั้นการเปรียบเทียบชอบ[1,1,1,1,3] < [1,1,1,1]ออก.)

การตรวจสอบว่ามีn-1รายการน้อยกว่าในการLรับรองว่าnเป็นคอมโพสิต (มีn-1totatives เป็นเงื่อนไขที่เทียบเท่ากับ primality.) และจากนั้นสภาพการเป็นจำนวนร์ไมเคิลเป็นว่าที่องค์ประกอบของทุกเท่าเทียมกันL 1ดังนั้นการเปรียบเทียบพจนานุกรมนี้ตรวจจับสิ่งLที่เราสนใจ

Mr. Xcoder บันทึก byte โดยเปลี่ยนเป็นรูปแบบแลมบ์ดาแบบเรียกซ้ำ: jนับถอยหลังทุกครั้งที่เรากดหมายเลข Carmichael และnนับทุกครั้งที่เราเรียกเก็บเงิน ดังนั้นเมื่อjศูนย์ถึงn-1เท่ากับoriginal_value_of_jจำนวนคาร์ไมเคิลที่


5

เจลลี่ ,  12  11 ไบต์

-1 ไบต์ขอบคุณไมล์ & Mr. Xcoder (ใช้อะตอมของฟังก์ชั่น Carmichael และสนามกอล์ฟของมัน)

%Æc’=ÆP
⁹Ç#

ลิงก์ monadic ที่รับnและส่งคืนรายการnหมายเลข Carmichael แรก

ลองออนไลน์!

อย่างไร?

เหมือนก่อนหน้านี้ (ด้านล่าง) ยกเว้นว่ามีฟังก์ชั่นในตัวสำหรับ Carmichael ซึ่งให้พลังงานที่เล็กที่สุดเช่นอินพุตที่ยกขึ้นสู่พลังนั้นสอดคล้องกับโมดูโลหนึ่งอันที่ใช้พลังงานสำหรับจำนวนเต็มทั้งหมด ดังนั้นเราอาจแยก false-positives (primes) ออกเป็นไบต์น้อยกว่าและมีโค้ดที่เร็วกว่า!

%Æc’⁼ÆP - isCarmichael: number, n (any integer)
 Æc     - Carmicael function of n
%       - n modulo that
   ’    - decremented (0 for Carmichael numbers and primes)
     ÆP - is n prime? (1 for primes 0 otherwise)
    ⁼   - equal?

⁹Ç# - Main link: number, n
  # - count up finding the first n values satisfying:
 Ç  - ...condition: call the last link as a monad
⁹   - ...starting with a value of: literal 256

12 ไบต์ก่อนหน้า:

Ṗ*%⁼Ṗ_ÆP
⁹Ç#

ลองออนไลน์! (ใช่มันหมดเวลาแล้วn=3)

อย่างไร?

ตัวเลขcเป็นจำนวนคาร์ไมเคิถ้ามันเป็นคอมโพสิตและมันก็เป็นความจริงที่ว่าจำนวนเต็มใด ๆxขึ้นไปcมีที่สอดคล้องกันแบบโมดูโลxc

เราเพียงแค่ต้องตรวจสอบเรื่องนี้เพื่อบวกxกับx=cตัวเอง

โปรดทราบด้วยว่าเมื่อx=cตรวจสอบแล้วว่าการxยกระดับพลังxนั้นสอดคล้องกับxโมดูโลหรือxไม่ซึ่งเป็นความจริงดังนั้นเราจึงไม่จำเป็นต้องตรวจสอบสิ่งนี้ (ทำให้รหัสสั้นลง)

Ṗ*%⁼Ṗ_ÆP - Link 1, isCarmichaelNumber: integer c (greater than 1)
Ṗ        - pop c (uses the implicit range(c)) = [1, 2, 3, ..., c-1]
 *       - raise to the power of c (vectorises) = [1^c, 2^c, 3^c, ..., (c-1)^c]
  %      - modulo by c (vectorises) = [1^c%c, 2^c%c, 3^c%c, ..., (c-1)^c%c]
    Ṗ    - pop c = [1, 2, 3, ..., c-1]
   ⁼     - equal? (non-vectorising) = 1 if so, 0 if not
      ÆP - isPrime?(c) = 1 if so, 0 if not
     _   - subtract = 1 if Carmichael 0 if not
         -     (Note the caveat that c must be an integer greater than 1, this is because
         -      popping 1 yields [] thus the equality check will hold; same for 0,-1,...)

⁹Ç# - Main link: number, n
  # - count up finding the first n values satisfying:
 Ç  - ...condition: call the last link as a monad
⁹   - ...starting with a value of: literal 256

นอกจากนี้12 ไบต์แต่คำนวณ 33 ครั้งแรกภายในไม่กี่นาทีโดยใช้อะตอม Carmichael
ไมล์

11 ไบต์โดยใช้ฟังก์ชัน Carmichael ในตัว
นาย Xcoder

@ Mr.Xcoder ฉันจะแนะนำไมล์ที่โพสต์แยกต่างหากจากนั้นเห็นคุณจากนั้นเห็นความคิดเห็นของคุณและลบ dv อาจเป็นเพราะมีคนคิดว่ามันคล้ายกับไมล์ที่คอมเม้นท์มากกว่าไมล์นี้ แต่ฉันคิดว่าแม้จะเป็นเหตุผลที่แปลกเพราะไม่มีเหตุผลที่จะคิดว่าคุณไม่พบสิ่งเดียวกันด้วยตนเอง (ฉันรู้ว่าฉัน) ฉันทำแบบนั้นหลายครั้ง) ฉันจะโพสต์ 11 ของคุณหากคุณต้องการ แต่เป็นความเห็นที่คุณหรือไมล์ควรใช้เครดิต
Jonathan Allan

@miles ด้วย ... ^
Jonathan Allan

@JanathanAllan เพียงโพสต์เอง พูดถึงไมล์ 'และการมีส่วนร่วมของฉันและฉันไม่คิดว่าไมล์ความคิดอย่างใดอย่างหนึ่ง :-) (BTW ฉันไม่ได้เห็นความคิดเห็นไมล์: - / ก่อนโพสต์คำตอบของฉัน)
นาย Xcoder

2

ECMAScript Regex, 86 89 ไบต์

คำเตือน:อย่าอ่านสิ่งนี้หากคุณไม่ต้องการให้เวทมนตร์ Regex ของคุณเสียหาย หากคุณต้องการที่จะทำการวิเคราะห์หาเวทมนตร์นี้ด้วยตัวเองฉันขอแนะนำให้เริ่มต้นด้วยการแก้ปัญหาบางอย่างใน ECMAScript regex: ดูโพสต์ก่อนหน้านี้สำหรับรายการปัญหาแนะนำที่ติดแท็กสปอยเลอร์อย่างต่อเนื่องเพื่อแก้ปัญหาทีละตัว

^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$))((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$)){2,}x$

ลองออนไลน์!

# Match Carmichael numbers in the domain ^x*$ using Korselt's criterion
# N = input number (initial value of tail)
^
(?!
    # Iterate through factors \1, with \2 = \1-1, for which \2 does not divide into N-1
    (x(x+))
    (?!\2*$)           # Assert N-1 is not divisible by \2
    \1*(?=\1$)         # Assert N is divisible by \1; tail = \1
    # If the factor \1, which already passed the aboved tests, is prime, then fail the
    # outside negative lookahead, because N is not a Carmichael number.
    (?!(xx+)\3+$)
)
# Assert that N has at least 2 unique prime factors, and that all of its prime factors
# are of exactly single multiplicity (i.e. that N is square-free).
(
    (?=(xx+?)\5*$)     # \5 = smallest prime factor of tail
    (?=(x+)(\6+$))     # \6 = tail / \5 (implicitly); \7 = tool to make tail = \6
    \7                 # tail = \6
    (?!\5*$)           # Assert that tail is no longer divisible by \5, i.e. that that
                       # prime factor was of exactly single multiplicity.
){2,}
x$

ความมหัศจรรย์หลักของ regex นี้อยู่ในส่วนที่ยืนยันว่าปัจจัยสำคัญทั้งหมดของ N นั้นมีความหลากหลายหลายหลาก มันเป็นกลอุบายแบบเดียวกับที่ใช้โดยสตริงการจับคู่ของฉันซึ่งความยาวคือพลังที่สี่และFind the Smoothest Number regexes: การหารโดยปริยายซ้ำโดยปัจจัยหลักที่เล็กที่สุด

นอกจากนี้ยังเป็นไปได้ที่จะทดสอบโดยตรงว่า N ไม่มีปัจจัยรูปสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบ (เช่น N นั้นไม่มีรูปทรงสี่เหลี่ยม) นี่ใช้ตัวแปรของอัลกอริทึมการคูณที่อธิบายสั้น ๆ ในย่อหน้าของโพสต์เลข regexของฉันมากมายเพื่อทดสอบว่าตัวเลขเป็นสี่เหลี่ยมจัตุรัสที่สมบูรณ์แบบหรือไม่ นี้เป็นสปอยเลอร์ ดังนั้นไม่ได้อ่านเพิ่มเติมใด ๆ ถ้าคุณไม่ต้องการบางขั้นสูงมายากล regex เอกมากมายสำหรับคุณ หากคุณต้องการที่จะหาวิธีแก้ปัญหานี้ด้วยตัวเองฉันขอแนะนำให้เริ่มต้นด้วยการแก้ปัญหาบางอย่างในรายการปัญหาที่แนะนำติดแท็กสปอยเลอร์ติดต่อกันในบทความก่อนหน้านี้และพยายามหาข้อมูลเชิงลึกทางคณิตศาสตร์อย่างอิสระ

อย่างไรก็ตามการใช้อัลกอริทึมนั้นกับปัญหานี้ไม่ได้ให้ประโยชน์ใด ๆ มันทำให้ regex ช้าลงโดยมีขนาดใหญ่กว่า 97 ไบต์ หากไม่มีการทดสอบหลายหลากนายกรัฐมนตรี (ซึ่งในวงเดียวยืนยันว่าทั้งสองมีปัจจัยสำคัญอย่างน้อย 2 และว่าพวกเขาแต่ละหลายหลากเดียว) เราจะต้องแยกต่างหากยืนยันว่า N เป็นคอมโพสิต

^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((xx+)\5*(?=\5$))?(x(x*))(?=(\6*)\7+$)\6*$\8)(xx+)\9+$

ลองออนไลน์!


 ^
 (?!
     # Iterate through factors \1, with \2 = \1-1, for which \2 does not divide into N-1
     (x(x+))
     (?!\2*$)           # Assert N-1 is not divisible by \2
     \1*(?=\1$)         # Assert N is divisible by \1; tail = \1
     # If the factor \1, which already passed the aboved tests, is prime, then fail the
     # outside negative lookahead, because N is not a Carmichael number.
     (?!(xx+)\3+$)
 |
 # Assert that N is square-free, i.e. has no divisor >1 that is a perfect square.
     ((xx+)\5*(?=\5$))?  # cycle tail through all of the divisors of N, including N itself
     # Match iff tail is a perfect square
     (x(x*))             # \6 = potential square root; \7 = \6 - 1
     (?=
         (\6*)\7+$       # iff \6 * \6 == our number, then the first match here must result in \8 == 0
     )
     \6*$\8              # test for divisibility by \6 and for \8 == 0 simultaneously
 )
 (xx+)\9+$               # Assert that N is composite
 


2
(การพูดอย่างเคร่งครัดนี่เป็นdecision-problemคำตอบ แต่ความท้าทายคือความsequenceท้าทาย) สันนิษฐานว่าในตัวแปรที่มีประสิทธิภาพมากขึ้นของ regex จะมีการทดสอบโดยตรงสำหรับตัวหารสแควร์หรือไม่
Neil

@ Neil คุณพูดถูกฉันสามารถตีมันลงได้โดยทดสอบกับตัวหารสแควร์โดยตรง ใน ECMA ไม่จำเป็นต้องมีคุณสมบัติพิเศษ แต่นั่นจะทำให้ช้าลงมาก (และฉันจะต้องการซ่อนไว้ภายใต้แท็กสปอยเลอร์ด้วย) ฉันต้องการรวมทั้งสองเวอร์ชันไว้ด้วย
Deadcode

ใช่มันน่ารำคาญมากที่พบคำถามสำหรับ regexes ที่ฉันเขียนไปแล้วซึ่งไม่ได้เป็นความท้าทายที่เหมาะสม ฉันควรจะลบคำตอบของฉัน?
Deadcode

@ Neil ที่นี่คุณไป ฉันใช้อัลกอริทึมโดยใช้ความคิดของคุณ นี่อาจเป็นเหตุผลว่าทำไมฉันไม่คิดที่จะติดตามด้วยตัวเอง มันส่งผลให้ใน regex อีกต่อไปเพราะจำเป็นต้องมีการทดสอบแบบประกอบ
Deadcode

(ภายใต้กฎเว็บไซต์คุณควรลบคำตอบของคุณใช่) ความคิดของฉันคือการใช้คุณสมบัติพิเศษของการพูด Retina regexes คุณสามารถตีมันลงไป^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$หรืออาจน้อยกว่า 72 ไบต์
Neil


1

เรติน่า 94 ไบต์

\d*$
x
"$+"}/^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$/^+`$
x
x

ลองออนไลน์! 1 การจัดทำดัชนี ไม่เร็วดังนั้นจะหมดเวลาสำหรับn>5TIO คำอธิบาย:

\d*$
x

เพิ่มค่าปัจจุบัน ในรอบแรกสิ่งนี้จะลบออกnจากบัฟเฟอร์เอาต์พุต (แต่$+ยังสามารถเข้าถึงได้)

/^(?!(x(x+))(?!\2*$)\1*(?=\1$)(?!(xx+)\3+$)|((^x|xx\5){2,})\4*$)(xx+)\6+$/

ทดสอบว่าค่าปัจจุบันเป็นหมายเลขคาร์ไมเคิล สิ่งนี้ใช้อัลกอริธึมทางเลือกของ @ Deadcode เนื่องจากการตรวจจับแบบสี่เหลี่ยมจะสั้นลงเมื่อเขียนโดยใช้ regex .NET / Perl / PCRE

^+`

ทำซ้ำจนกระทั่งค่าปัจจุบันเป็นตัวเลข Carmichael

$
x

เพิ่มค่าปัจจุบัน

"$+"}

ทำซ้ำการเพิ่มครั้งแรกและสูงกว่าnเวลาลูป

x

แปลงผลลัพธ์เป็นทศนิยม


0

Haskell , 95 ไบต์

s=filter
c n=s(\x->let l=s((1==).gcd x)f;f=[1..x-1]in l/=f&&all(\y->y^(x-1)`mod`x==1)l)[1..]!!n

ลองออนไลน์!

Degolfed:

-- function to filter out Carmichael numbers
filterFunction x = 
    let coprimes = filter ((1 ==) . gcd x) lesserNumbers
        lesserNumbers = [1 .. x - 1]
    in
        -- the number x is Carmichael if it is not prime
        lesserNumbers /= coprimes && 
            -- and all of its coprimes satisfy the equation
            all (\y -> y ^ (x - 1) `mod` x == 1) coprimes

-- get n'th Carmichael number (zero-based)
c n = filter filterFunction [1..] !! n
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.