มันคือ Mersenne Prime หรือไม่?


35

ตัวเลขคือMersenne Primeถ้าทั้งคู่เป็น Prime และสามารถเขียนในรูปแบบ2 n -1โดยที่nเป็นจำนวนเต็มบวก

งานของคุณคือกำหนดจำนวนเต็มบวกใด ๆ พิจารณาว่าเป็น Mersenne หรือไม่ คุณสามารถส่งทั้งฟังก์ชั่นที่ส่งกลับค่าความจริง / เท็จหรือโปรแกรมเต็มรูปแบบที่ดำเนินการ IO

กฎ:

  • เนื่องจากเป็นคุณควรตั้งเป้าหมายให้สั้นที่สุดนับไบต์ อนุญาตให้สร้างเครื่องได้
  • ใช้ช่องโหว่ของการเล่นกอล์ฟแบบมาตรฐาน - คุณไม่สามารถอ่านค่ากำหนดของ Mersenne จากไฟล์ภายนอกหรือเขียนโค้ดลงในโปรแกรมของคุณ
  • โปรแกรมของคุณควรทำงานกับค่าภายในขนาดจำนวนเต็มมาตรฐานของภาษาของคุณ

กรณีทดสอบ

สำหรับการอ้างอิงรายการ (ที่รู้จักกัน) จำนวนเฉพาะแมร์แซนสามารถพบได้ที่นี่ กรณีทดสอบที่มีประโยชน์ ได้แก่ :

2  -> False
1  -> False 
20 -> False
51 -> False
63 -> False

3    -> True
31   -> True
8191 -> True

สุขสันต์วันคริสต์มาสทุกคน! มีวันหยุดที่ดีไม่ว่าคุณจะฉลองอะไรก็ตาม :)


2
ถ้าฉันสามารถฉันจะลงคะแนนให้เป็นสิ่งที่ท้าทายความสามารถของisprimeเพราะมันไม่ได้เพิ่มอะไรใหม่
ข้อบกพร่อง

9
@flawr พวกเขาคล้ายกันมาก - แต่สำหรับความท้าทายนี้มีโอกาสน้อยกว่าที่จะเป็น builtin และมีวิธีการที่น่าสนใจมากมายในการพิจารณาว่าตัวเลขนั้นสามารถแทนได้หรือไม่2^n-1
FlipTack

1
ฉันเชื่อว่าคำจำกัดความของหมายเลข Mersenne นั้นได้รับคำสั่งว่า n เป็นสิ่งสำคัญ (เงื่อนไขที่ได้รับการพิสูจน์แล้วว่าจำเป็น แต่ไม่เพียงพอสำหรับ (2 ^ n) -1 ถึงจะเป็นจำนวนมาก)
SuperJedi224

4
@ SuperJedi224 nอยู่เสมอที่สำคัญ แต่รู้ว่าไม่มีอะไรเปลี่ยนแปลงคำจำกัดความยังคงถูกต้อง
FlipTack

2
@TheBitByte ใช่ - หากคุณใช้อัลกอริทึมที่อิงตามความน่าจะเป็นซึ่งไม่ได้ผล 100% ของเวลาคุณยังสามารถโพสต์ได้ แต่จะไม่สามารถแข่งขันได้ :)
FlipTack

คำตอบ:


19

เยลลี่ 5 ไบต์

&‘<ÆP

ลองออนไลน์!

มันทำงานอย่างไร

&‘<ÆP  Main link. Argument: x

 ‘     Yield x+1.
&      Take the bitwise AND of x and x+1.
       This yields 0 iff x is a Mersenne number, i.e., iff x+1 is a power of 2.
   ÆP  Yield 1 if x is a prime, 0 if not.
  <    Compare the results to both sides,
       This yields 1 iff x is both a Mersenne number and a prime.

ปัญหาเดียวกันกับคำตอบของ Adnan ดูmothereff.in/byte-counter
Kelly Lowder

8
@KellyLowder นั้นการนับไบต์ใช้ UTF-8 ทั้ง Jelly และ 05AB1E ใช้ชุดอักขระไบต์เดียว
Dennis

24

05AB1E , 5 ไบต์

จำนวนบวกในรูปแบบ2 n - 1ในไบนารีเท่านั้นประกอบด้วย1

รหัส:

b`¹pP

คำอธิบาย:

b`      # Push each digit of the binary representation of the number onto the stack
  ¹p    # Check if the input is prime
    P   # Take the product of all these digits

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด


5
ฉันสงสัยว่านานแค่ไหนที่มีคนใช้เคล็ดลับนั้น :)
FlipTack

¹ใช้เวลา 2 ไบต์ดังนั้นนี่คือ 6
Kelly Lowder

5
@ KellyLowder ใน UTF-8 ใช่ อย่างไรก็ตาม 05AB1E ใช้การเข้ารหัส CP-1252 มากกว่าการเข้ารหัส UTF-8
Adnan

10

Pythonขนาด 45 ไบต์

lambda n:-~n&n<all(n%i for i in range(2,n))<n

ลองออนไลน์!

มันทำงานอย่างไร

เงื่อนไขสามข้อของการเปรียบเทียบแบบโยง

-~n&n<all(n%i for i in range(2,n))<n

ทำดังต่อไปนี้:

  • -~n&nคำนวณค่าที่เหมาะสมและ1 + nและn เนื่องจากnประกอบด้วยเพียง1บิตเท่านั้นหากเป็นตัวเลข Mersenne ค่าบิตและจะส่งคืน0ถ้า (และเฉพาะในกรณีนี้) เป็นกรณีนี้

  • all(n%i for i in range(2,n))ผลตอบแทนที่แท้จริงและถ้าหากn mod ฉันเป็นที่ไม่ใช่ศูนย์สำหรับค่าทั้งหมดของฉันใน[2, ... , n - 1]คือถ้าหากว่าnไม่มีตัวหารบวกนอกเหนือจาก1และn

    กล่าวอีกนัยหนึ่งทั้งหมดจะคืนค่าเป็นจริงถ้าหากnเป็นจำนวนรวมเท่านั้นเช่นnคือ1หรือจำนวนเฉพาะ

  • n อธิบายตนเองได้

การเปรียบเทียบแบบลูกโซ่จะคืนค่าTrueถ้าหากการเปรียบเทียบแต่ละรายการทำแบบเดียวกัน

  • เนื่องจากทุกผลตอบแทนทั้งทรู / 1หรือเท็จ / 0 , -~n&n<all(n%i for i in range(2,n))สามารถกลับมาทรูถ้า-~n&nอัตราผลตอบแทน0 (เช่นถ้าnเป็นจำนวน Mersenne) และทุกผลตอบแทนที่แท้จริง (เช่นถ้าnทั้ง1หรือนายก)

  • การเปรียบเทียบall(n%i for i in range(2,n))<nจะถือครองเมื่อใดก็ตามที่n> 1แต่เนื่องจากทั้งหมดคืนค่าเป็นจริงถ้าn = 1 การเปรียบเทียบจะไม่ถือในกรณีนี้


1
ว้าวมันช่างน่าทึ่ง :)
ABcDexter

8

Brachylogขนาด 7 ไบต์

#p+~^h2

ลองออนไลน์!

โปรแกรม Brachylog นั้นเป็นลำดับของข้อ จำกัด ซึ่งก่อให้เกิดห่วงโซ่: ข้อ จำกัด แรกอยู่ระหว่างอินพุตและนิรนามที่ไม่ระบุชื่อ (ลองเรียกมันว่าAสำหรับจุดประสงค์ของการสนทนานี้), ข้อ จำกัด ที่สองคือนิรนามที่ไม่รู้จักและที่สองนิรนาม ไม่ทราบ (ซึ่งเราจะเรียกB ) และอื่น ๆ ดังนั้นโปรแกรมจะแยกย่อยดังนี้:

#p      Input = A, and is prime
+       B = A + 1
~^      B = X to the power Y, C = the list [X, Y]
h       D = the head of list C (= X)
2       D = 2

วิธีเดียวที่ข้อ จำกัด ทั้งหมดนี้สามารถทำได้พร้อมกันคือถ้า B คือพลังของ 2 นั่นคืออินพุตเป็นกำลัง 2 ลบ 1 และอินพุตก็สำคัญเช่นกัน (Brachylog ใช้ตัวแก้ข้อ จำกัด ภายในดังนั้นโปรแกรมจะไม่มีประสิทธิภาพเท่าที่ดูลำดับการประเมินมันจะทราบว่าCเป็นรูปแบบ[2, Y]ก่อนที่จะพยายามแสดงBเป็นการยกกำลังของตัวเลขสองตัว)

น่าสนใจ#p+~^ เกือบใช้งานได้เนื่องจากไพรเมอร์ที่มีลักษณะเหมือนของ Mersenne สามารถใช้ 2 เป็นฐานในกรณีที่ไม่เสื่อมโทรม ( พิสูจน์ ) แต่ a) มันล้มเหลวสำหรับช่วงเวลาที่ไม่ใช่ Mersenne B -1 เนื่องจากสามารถแสดงเป็นB ¹และ b ) ล่าม Brachylog ที่มีอยู่ดูเหมือนจะสับสน (เข้าสู่อนันต์หรืออย่างน้อยก็เป็นเวลานาน) โดยโปรแกรมที่มีข้อ จำกัด ไม่ดี ดังนั้น 7 ไบต์จึงไม่น่าจะถูกโจมตีใน Brachylog


ฉันประทับใจ! สำหรับปัญหาลูปแบบไม่สิ้นสุดนี่เป็นเพราะการโอเวอร์โหลดของเพรดิเคต มองย้อนกลับไปฉันคิดว่าฉันไม่ควรใช้งานเกินพิกัดสำหรับเพรดิเคตใด ๆ สิ่งนี้ยังทำให้เกิดปัญหาในสิ่งต่าง ๆ เช่น findall
เสียชีวิต

7

Mathematica 26 Bytes

PerfectNumberQ[# (#+1)/2]&

ดูหลักฐานนี้

ทำงานได้ตราบใดที่ไม่มีตัวเลขสมบูรณ์แบบแปลก ๆ และไม่มีใครรู้ว่ามีอยู่จริง


ดังนั้นคำตอบของคุณไม่ได้รับการพิสูจน์ว่าถูกต้อง?
Jonathan Frech

ฉันไม่คิดว่าจำเป็นต้องใช้พื้นที่ว่าง
Jonathan Frech

@JonathanFrech สูตรn(n+1)/2สร้างตัวเลขที่สมบูรณ์แบบแม้เมื่อใดก็ตามที่nเป็น Mersenne prime (Euclid) ดูเหมือนจะไม่เป็นที่ทราบว่าจำนวนคี่ที่สมบูรณ์แบบสามารถมีรูปแบบได้n(n+1)/2หรือไม่เช่นเป็นตัวเลขสามเหลี่ยม ตัวเลขที่สมบูรณ์แบบทั้งหมดแม้จะเป็นรูปสามเหลี่ยมซึ่งนี่nคือ Mersenne prime (Euler)
Jeppe Stig Nielsen

1
@JeppeStigNielsen คำถามคือถ้ามันถูกต้องที่จะใช้ความจริงที่ไม่รู้จักที่จะแก้ปัญหาของฐาน
Jonathan Frech

7

Mathematica, 29 26 ไบต์

แก้ไข: บันทึกแล้ว 3 ไบต์ขอบคุณ Martin Ender

PrimeQ@#&&IntegerQ@Log2[#+1]&

PrimeQ@#&&1>BitAnd[#,#+1]&

ฉันสงสัยว่ามันจะเร็วขึ้นเนื่องจากเลขชี้กำลัง 42 ตัวแรกนั้นเป็นรหัสตายตัว:

MersennePrimeExponentQ@Log2[#+1]&

6
PrimeQ@#&&1>BitAnd[#,#+1]&
Martin Ender

5

Perl 6 , 29 ไบต์

{.base(2)~~/^1*$/&&.is-prime}

ลองมัน

ขยาย:

{             # bare block lambda with implicit parameter 「$_」

  .base(2)    # is its binary representation ( implicit method call on 「$_」 )
   ~~
  /^ 1* $/    # made entirely of 「1」s

  &&          # and

  .is-prime   # is it prime

}

ตั้งแต่ Perl 6 มีขนาดใหญ่ Ints พลก็ไม่ได้แผ่นด้านหน้าของ.base(2)กับ0s


5

Python, 83 82 79 76 73 ไบต์

def f(m):
 s,n=(m!=3)*4,m>>2
 while-~m&m<n:s,n=(s*s-2)%m,n>>1
 return s<1

Python 2, 71 ไบต์

def f(m):
 s,n=(m!=3)*4,m/4
 while-~m&m<n:s,n=(s*s-2)%m,n/2
 return s<1

ฟังก์ชั่นนี้ใช้primality ทดสอบ Lucas-Lehmerดังนั้นในขณะที่มันไม่ได้เป็นสั้นบางส่วนของข้อเสนองูใหญ่อื่น ๆ มันมากได้เร็วขึ้นในการจัดการปัจจัยการผลิตขนาดใหญ่


นี่คือรหัสทดสอบบางส่วนที่ทำงานบน Python 2 หรือ Python 3

from __future__ import print_function

def primes(n):
    """ Return a list of primes < n """
    # From http://stackoverflow.com/a/3035188/4014959
    sieve = [True] * (n//2)
    for i in range(3, int(n**0.5) + 1, 2):
        if sieve[i//2]:
            sieve[i*i//2::i] = [False] * ((n - i*i - 1) // (2*i) + 1)
    return [2] + [2*i + 1 for i in range(1, n//2) if sieve[i]]

def lucas_lehmer_old(p):
    m = (1 << p) - 1
    s = 4
    for i in range(p - 2):
        s = (s * s - 2) % m
    return s == 0 and m or 0

# much faster
def lucas_lehmer(p):
    m = (1 << p) - 1
    s = 4
    for i in range(p - 2):
        s = s * s - 2
        while s > m:
            s = (s & m) + (s >> p)
    return s == 0 or s == m and m or 0

def f(m):
 s,n=(m!=3)*4,m>>2
 while-~m&m<n:s,n=(s*s-2)%m,n>>1
 return s<1

# Make a list of some Mersenne primes
a = [3]
for p in primes(608):
    m = lucas_lehmer(p)
    if m:
        print(p, m)
        a.append(m)
print()

# Test that `f` works on all the numbers in `a`
print(all(map(f, a))) 

# Test `f` on numbers that may not be Mersenne primes
for i in range(1, 525000):
    u = f(i)
    v = i in a
    if u or v:
        print(i, u, v)
    if u != v:
        print('Error:', i, u, v)

เอาท์พุต

3 7
5 31
7 127
13 8191
17 131071
19 524287
31 2147483647
61 2305843009213693951
89 618970019642690137449562111
107 162259276829213363391578010288127
127 170141183460469231731687303715884105727
521 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151
607 531137992816767098689588206552468627329593117727031923199444138200403559860852242739162502265229285668889329486246501015346579337652707239409519978766587351943831270835393219031728127

True
3 True True
7 True True
31 True True
127 True True
8191 True True
131071 True True
524287 True True

FWIW นี่เป็นรุ่นที่มีประสิทธิภาพมากกว่าเล็กน้อยfที่ไม่ได้ทำการทดสอบmซ้ำในทุกลูป:

def f(m):
 s,n=m!=3and 4,m>>2
 if-~m&m<1:
  while n:
   s=(s*s-2)%m
   n>>=1
 return s<1

คุณสามารถเขียน while loop ได้ทั้งหมดในบรรทัดเดียว (ไม่จำเป็นต้องขึ้นบรรทัดใหม่และเยื้อง)
FlipTack

@FlipTack D'oh! ขอขอบคุณ! ฉันไม่รู้ว่าทำไมฉันถึงพลาด ... และฉันเพิ่งสังเกตุเห็นว่าฉันสามารถโกนหนวดออกไปได้สองสามไบต์โดยย้อนกลับไปที่ Python 2
PM 2Ring

4

R, 41 40 ไบต์

matlab::isprime(x<-scan())&!log2(x+1)%%1

ผิดปกติพอ builtin ใน R mersenneใช้เวลาเป็นอาร์กิวเมนต์ไม่n2^n-1

สิ่งนี้ใช้เวลาxจาก STDIN ตรวจสอบว่ามันยอดเยี่ยมใช้matlabแพ็คเกจและตรวจสอบว่า 2-log ของx+1เป็นจำนวนเต็มหรือไม่โดยใช้ mod 1 และตรวจสอบ 'not zero-ness'

นอกจากนี้ถ้าคุณใช้mersenneบิวอินมันจะสั้นลงเล็กน้อย แต่รู้สึกว่าโกง:

numbers::mersenne(log2(scan()+1))

บันทึก 1 ไบต์ขอบคุณ @Billywob


โพสต์คำตอบที่คล้ายกัน แต่ฉันลบมันตอนนี้ ฉันขอแนะนำmatlab::isprimeให้บันทึกหนึ่งไบต์ นอกจากนี้คุณต้องใช้<-สำหรับการกำหนดในฟังก์ชั่น
Billywob

@billywob เพิ่งสังเกตเห็นว่า matlab :: isprime นั้นสั้นกว่า 1 ไบต์ (ได้สูงสุด 1 วินาทีที่ทางออกของคุณ)
JAD

นอกจากนี้คุณยังสามารถใช้แทนlog2(x+1) log(x+1,2)
Billywob


2

ที่จริงแล้ว 9 ไบต์

;├╔'1=@p*

ลองออนไลน์!

คำอธิบาย:

เนื่องจากตัวเลขทั้งหมดของฟอร์ม 2 n -1 มี 1 ทั้งหมดในการแทนเลขฐานสองของมัน Mersenne prime จึงสามารถระบุได้ว่าเป็นหมายเลขเฉพาะที่มีคุณภาพนั้น

;├╔'1=@p*
 ├╔'1=     only unique binary digit is 1
        *  and
;     @p   is prime

2

เยลลี่ 5 ไบต์

วิธีอื่นในการตอบกลับ Jelly @ 5 ที่มีอยู่ของ @Dennis:

B;ÆPP

ลองออนไลน์!

มันทำงานอย่างไร:

B      Returns the binary representation of the input as a list [1, 0, 1, 1, ...]
 ;     And attach to this list 
  ÆP   a 1 if the input is a prime, 0 otherwise
    P  Calculates the product of this list of 1's and 0's

เนื่องจาก Mersenne Prime มีค่าน้อยกว่ากำลัง 2 จึงเป็นตัวแทนไบนารีของมันได้อย่างยอดเยี่ยม 1 ผลลัพธ์สำหรับ 1 คือ Mersenne primes และ 0 ในกรณีอื่นทั้งหมด


2

Ceylon, 66 ไบต์

Boolean m(Integer c)=>c>2&&c.and(c+1)<1&&!(2:c-2).any((d)=>c%d<1);

จัดรูปแบบ (และแสดงความคิดเห็น):

// Check whether a (positive integer) number is a mersenne prime number.
//
// Question:  http://codegolf.stackexchange.com/q/104508/2338
// My Answer: http://codegolf.stackexchange.com/a/104805/2338

Boolean m(Integer c) =>
        // check whether c+1 is a power of two
        c.and(c+1)<1 &&
        // the standard primality check by trial division
         !(2 : c-2).any((d) => c%d < 1) &&
        // we need to exclude 1, which is unfortunately
        // matched by both criteria above, but is no prime.
        c>1;

ด้วยการโกง (การเข้ารหัสโค้ดให้อยู่ในช่วงของ Integer ของ Ceylon) เราสามารถทำให้จำนวนไบต์สั้นลง (65):

Boolean h(Integer c) =>
        c.and(c+1)<1 && #20000000800a20ac.and(c+1)>0;

(ดูเหมือนว่าเครื่องมือเน้นข้อความในเครื่องจะเข้าใจผิดเลขฐานสิบหกของ Ceylon ว่าเป็นจุดเริ่มต้นของการแสดงความคิดเห็น)

หากฟังก์ชั่นนิรนามไม่เป็นไรฟังก์ชันนี้มีขนาด 49 ไบต์:

[2,3,5,7,13,17,19,31,61].map((p)=>2^p-1).contains

2

ภาษา Wolfram (Mathematica)ขนาด 23 ไบต์

PrimeQ[BitAnd[#,#+2]#]&

ลองออนไลน์!

1 PrimeQ[BitAnd[1,1+2]*1] == PrimeQ@1 == Falseมีการจัดการอย่างถูกต้องเพราะ ไม่เช่นนั้นBitAnd[#,#+2]#เราจะต้อง#มีความสำคัญและBitAnd[#,#+2] == 1จะเกิดขึ้นเมื่อใด#คือหมายเลข Mersenne


ทำได้ดีมาก! ในขณะที่บางคนที่ไม่เคยใช้ Mathematica รหัส TIO ของคุณอาจสับสนในตอนแรก จากนั้นฉันก็รู้ว่าคุณกำลังเปรียบเทียบฟังก์ชั่นของคุณกับผู้ถือระเบียนก่อนหน้าของ ngenisis ฉันคิดว่ามันจะดีกว่าเพียงแค่แสดงผลลัพธ์ของฟังก์ชันและอาจมีลิงค์ที่สองเปรียบเทียบกับโซลูชันอื่น ๆ
Deadcode

2

ECMAScript regex, 42 31 ไบต์

^(?!(xx+)\1+$)(x(x*)(?=\3$))+x$

^
(?!(xx+)\1+$)      # Assert that N is prime or 0 or 1.
(x(x*)(?=\3$))+x$  # Assert that N is a power of 2 minus 1 and is >= 3.
                   # The >=3 part of this prevents the match of 0 and 1.

ลองออนไลน์!

แก้ไข: ลดลงถึง 31 ไบต์ขอบคุณ Neil

พื้นฐาน "เป็นอำนาจของ 2 ลบ 1" ^(x(x*)(?=\2$))*$การทดสอบคือ วิธีนี้ใช้งานได้โดยวนลูปการดำเนินการ "ลบ 1 จากนั้นหารด้วย 2" เท่า ๆ กันจนกว่าจะไม่สามารถทำได้อีกต่อไปจากนั้นยืนยันว่าผลลัพธ์เป็นศูนย์ สิ่งนี้สามารถแก้ไขเพื่อให้ตรงกับตัวเลข≥1เท่านั้นโดยเปลี่ยนอันสุดท้าย*เป็น a +บังคับให้ลูปวนซ้ำอย่างน้อยหนึ่งครั้ง การแทรกxก่อนหน้าสุดท้าย$จะแก้ไขเพื่อให้ตรงกับตัวเลข≥3เท่านั้นโดยยืนยันว่าผลลัพธ์สุดท้ายหลังจากวนซ้ำอย่างน้อยหนึ่งครั้งคือ 1

ที่เกี่ยวข้อง "เป็นอำนาจของ 2" ^((x+)(?=\2$))*x$การทดสอบคือ นอกจากนี้ยังมีชวเลขสำหรับการจับคู่อำนาจของ 2 ลบ 2 ค้นพบโดยสกปรก^((x+)(?=\2$)x)*$ : regexes ทั้งสามนี้มีความยาวเท่ากัน

ทางเลือกรุ่น 31 ไบต์โดย Grimy :

^(?!(xx+)\1+$|((xx)+)(\2x)*$)xx

ลองออนไลน์!

# Match Mersenne primes in the domain ^x*$
^                   # N = input number
(?!                 # "(?!p|q)" is equivalent to "(?!p)(?!q)"; evaluate the
                    # logical AND of the following negative lookaheads:
    (xx+)\1+$       # Assert that N is prime or 0 or 1
|
    ((xx)+)(\2x)*$  # Assert that N is a power of 2 minus 1; this is based
                    # on "(?!(x(xx)+)\1*$)" which matches powers of 2.
)
xx                  # Assert that N >= 2, to prevent the unwanted match of
                    # 0 and 1 by both of the negative lookahead statements.

1
ประหยัด 11 ไบต์โดยการตรวจสอบโดยตรงกับหมายเลข 1 น้อยกว่ากำลัง 2: ลองออนไลน์!
Neil

@ นีลขอบคุณมาก! ฉันหวังว่าฉันจะคิดอย่างนั้น แต่แล้วนี่คือสิ่งที่ฉันต้องการจะเกิดขึ้น!
Deadcode

1
จริงๆแล้วคิดเกี่ยวกับมันจะx(x+)(?=\3$)มีประสิทธิภาพมากขึ้นเล็กน้อย
Neil

ใช่คุณพูดถูก
Deadcode

2

Regex (ECMAScript), 29 ไบต์

^(?!(xx+|(x(x))+)(\1\3)+$)xxx

ลองออนไลน์!

แรงบันดาลใจจาก Grimy ในการแชท

regex อ้างว่าเข้าเป็นมากกว่า 3 และว่ามันเป็นค่าของรูปแบบ: หรือ(xx+)\1+((xx)+)(\1x)+

ตัวเลขแรกที่ตรงกัน
ตัวที่สองจับคู่หมายเลขที่น้อยกว่าตัวคูณที่มีจำนวนมากกว่า 1 ตัว

01
2n1

เนื่องจาก 2 เป็นเพียงไพรม์เดียวที่น้อยกว่าไพรม์คี่ 1 ลบ lookahead เชิงลบพร้อมกับการยืนยันว่าอินพุตมากกว่า 3 จะตรงกับช่วงเวลาเฉพาะ mersenne




1

Python ขนาด 65 ไบต์

f=lambda n,i=3:(n^i)-all(n%i for i in range(2,n))<0 or f(n,-~i|i)

ส่งออกผ่านรหัสทางออก เกิดข้อผิดพลาดในการเรียกซ้ำสำหรับเท็จ ไม่มีข้อผิดพลาดสำหรับ True

มันทำงานอย่างไร

ตั้งแต่2^n-1ในไบนารีทำจาก 1 ต่อไปจำนวนสามารถสร้างขึ้นโดย2^n-1number|number+1

ฟังก์ชั่นนี้ใช้สิ่งนี้โดยการ2^n-1ตรวจสอบแต่ละหมายเลขซ้ำ ๆ ซ้ำ ๆเพื่อดูว่าเป็นหมายเลขเฉพาะและป้อนไปยังอินพุตหรือไม่ ถ้าจำนวนนั้นไม่ใช่ไพร์มไพร์มไพ ธ อนก็จะโยนข้อผิดพลาดเนื่องจากความลึกการเรียกซ้ำสูงสุดจะเกิน


1
ถ้าฉันไม่ผิด~><0 0>
Jonathan Frech

1

มีขนาด 7 ไบต์

oBoIpP#

ลองออนไลน์!

สิ่งนี้ใช้ประโยชน์จากความจริงที่ว่าตัวเลข mersenne มีเพียงตัวเลขเดียวในการแทนค่าไบนารี่:

oB      \ Pop input, push its binary digits.
  oI    \ Re-push the input
    p   \ Test its primality (0/1)
     P# \ Print the product of the stack

ผลิตภัณฑ์สแต็คจะเกิดขึ้น1หากหมายเลขนั้นไม่มีเลขศูนย์ในการแทนค่าไบนารี่ของมันและTrueอันดับแรกคือ


1

Pyth , 8 ไบต์

&.AjQ2P_

ตรวจสอบกรณีทดสอบทั้งหมด

Pyth , 8 ไบต์

<.&QhQP_

ตรวจสอบกรณีทดสอบทั้งหมด


อย่างไร?

การแจกแจงรหัส # 1

&.AjQ2P_    Full program with implicit input.

      P_    Is Prime?
   jQ2      Convert the input to binary as a list of digits.
 .A         All the elements are truthy (i.e. all are 1).
&           Logical AND.
            Output implicitly.

มันทำงานอย่างไร

จำนวนของรูปแบบ2 n - 1ประกอบด้วย1เท่านั้นเมื่อเขียนในไบนารี ดังนั้นเราจะทดสอบว่าเลขฐานสองทั้งหมดเป็น1หรือไม่

การแจกแจงรหัส # 2

<.&QhQP_    Full program with implicit input.

      P_    Is Prime?
    hQ      Input + 1.
 .&Q        Bitwise AND between the input and ^.
<           Is smaller than? I.e. The bitwise AND results in 0 and the primality test results in 1.
            Output implicitly.

มันทำงานอย่างไร

เป็นการทดสอบว่าอินพุต + 1เป็นกำลังสองหรือไม่ (เช่นถ้าเป็นหมายเลข Mersenne) จากนั้นทำการทดสอบแบบดั้งเดิม ในหลามboolเป็น subclass ของintดังนั้น truthy จะถือว่าเป็น1และ falsy จะถือว่าเป็น0 เพื่อหลีกเลี่ยงการตรวจสอบอย่างชัดเจนว่าหนึ่งคือ0และอีกหนึ่งเป็น1เราเปรียบเทียบค่าของพวกเขาโดยใช้<(เนื่องจากเรามีเพียง 1 กรณีดังกล่าว)


1

Java 8, 53 52 49 ไบต์

n->{int i=1;for(;n%++i>0;);return(n&n+1|i^n)==0;}

ข้อผิดพลาดคงที่และแข็งแรงเล่นกอล์ฟ 4 ไบต์ขอบคุณที่@Nevay

คำอธิบาย:

ลองที่นี่

n->{                // Method with integer parameter and boolean return-type
  int i=1;          //  Temp integer `i`, starting at 1
  for(;n%++i>0;);   //  Loop and increase `i` as long as `n` is divisible by `i`
  return(n&n+1|i^n) //  Then return if `n` bitwise-AND `n+1` bitwise-OR `i` bitwise-XOR `n`
          ==0;      //  is exactly 0
}                   // End of method

วิธีแก้ปัญหาปัจจุบันส่งกลับtrueสำหรับทุกนายก> 2 ไม่เพียง แต่สำหรับ Mersenne primes, 56 ไบต์:n->{for(int i=2;i<n;n&=-n%i++>>-1);return(n&n+1)<1&n>2;}
Nevay

1
52 ไบต์:n->{int i=1;for(;++i<n&n%i>0;);return(n&n+1|i^n)<1;}
2560

@Nevay ขอบคุณ .. และไม่แน่ใจว่าทำไมกรณีทดสอบไม่รวมถึงช่วงเวลาที่ไม่ได้รวมช่วงเวลา ... เพิ่มพวกเขาด้วยตัวเองและคุณพูดถูก
Kevin Cruijssen

1
49 ไบต์:n->{int i=1;for(;n%++i>0;);return(n&n+1|i^n)==0;}
2560

1

Python 3, 68 ไบต์

a=int(input());print(a&-~a<1and a>1and all(a%b for b in range(2,a)))

ลองที่นี่

Python 2, 63 ไบต์

a=input();print(a&-~a<1)and a>1and all(a%b for b in range(2,a))

ลองที่นี่


ขอบคุณสำหรับคำแนะนำของโจนาธาน


เปิดคำแนะนำใด ๆ เพื่อลดจำนวน bytecount


1
1 and1and~>
Jonathan Frech


0

Python, 93 ไบต์

def f(a):
 for b in range(a):
  if(a+1==2**b and not[i for i in range(2,a)if a%i<1]):return 1

รหัสนี้จะใช้ได้ทั้ง Python 2 และ Python 3 ดังนั้นฉันจึงไม่ได้ระบุเวอร์ชัน


0

แร็กเก็ต 76 ไบต์

(define(g m)(for/or((i m))(= m(-(expt 2 i)1))))(if(and(prime? n)(g n))#t #f)

Ungolfed:

(require math)
(define(f n)
  (define (ispowerminus1 m)
    (for/or ((i m))
      (= m (-(expt 2 i)1))))
  (if (and (prime? n)
           (ispowerminus1 n))
      #t #f))

การทดสอบ:

(f 1)
(f 2)
(f 20)
(f 51)
(f 63)
(f 3)
(f 31)
(f 8191)

เอาท์พุท:

#f
#f
#f
#f
#f
#t
#t
#t

0

PHP, 53 ไบต์

for($i=$n=$argv[1];--$i&&$n%$i;);echo!($i-1|$n+1&$n);

รับอาร์กิวเมนต์บรรทัดคำสั่ง พิมพ์1สำหรับ Mersenne prime, สตริงว่างอื่น -rทำงานด้วย

ทำให้พังถล่ม

for($i=$n=$argv[1];--$i&&$n%$i;);   // loop $i down from $n-1 until $i divides $n
                        // If $n is prime, loop ends with $i=1. ($n=1 -> $i=0)
echo!($i-1|$n+1&$n);    // If $i!=1, $n is not prime. If ($n+1&$n)>0, $n is not Mersenne.
                        // If either $i-1 or $n+1&$n is truthy, the negation will be false.

0

C, 94 ไบต์

g(n,i){return--i?g(2*n,i):n;}n,r;f(x){for(n=r=1;++n<x;)r=x%n?x^g(2,n)-1?r:r|2:r&2;return r>2;}

ผลตอบแทนที่ 1 ถ้าจำนวนเป็น Mersenne Prime มิฉะนั้น 0


แนะนำ~x+g(2,n)แทนx^g(2,n)-1
ceilingcat

0

สกาลา, 59 ไบต์

def f(t:BigInt)=t.isProbablePrime(t.bitLength*9)&(1+t)%2==0

BigIntฟังก์ชั่นนี้ต้องมีการป้อนข้อมูลที่จะเป็น คุณสามารถแปลงสตริง "162259276829213363391578010288127" (2 ** 107-1 เป็นเซนเนนายก) ลงโดยการทำBigInt BigInt("162259276829213363391578010288127")อาจผิดไปตามชื่อของisProbablePrime()วิธีการที่แนะนำ 0.5^(t.bigLength)*9แต่น่าจะเป็นไม่เกิน

เวอร์ชั่นสคริปต์แบบสแตนด์อโลนยาว 72 ไบต์

val t=BigInt(args(0));print(t.isProbablePrime(t.bitLength*9)&(1+t)%2==0)

สมมติว่าเราบันทึกเป็น "t.scala" จากนั้นโปรแกรมสามารถเรียกใช้เป็น

>scala t.scala 162259276829213363391578010288127
>true

คุณสามารถลบProbableจากisProbablePrimeถ้า Scala มีisPrimeฟังก์ชั่น
MilkyWay90

0

Perl 5 , 53 ไบต์

รหัส 52 ไบต์ + 1 สำหรับ -p

$f=0|sqrt;1while$_%$f--;$_=!$f*(sprintf'%b',$_)!~/0/

ลองออนไลน์!


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