এটা কি মার্সেন প্রাইম?


35

একটি সংখ্যা একটি মরসেন প্রাইম যদি এটি উভয়ই প্রধান হয় এবং 2 এন -1 ফর্মটিতে লেখা যেতে পারে , যেখানে এনটি ধনাত্মক পূর্ণসংখ্যা।

আপনার কাজটি কোনও ধনাত্মক পূর্ণসংখ্যার ভিত্তিতে দেওয়া হয়েছে, এটি নির্ধারণ করা উচিত যে এটি মার্সেন প্রাইম কিনা। আপনি হয় এমন একটি ফাংশন জমা দিতে পারেন যা সত্য / মিথ্যা মান দেয়, বা একটি সম্পূর্ণ প্রোগ্রাম যা IO সম্পাদন করে।

নিয়মাবলী:

  • যেহেতু এটি , আপনার পক্ষে লক্ষ্য করা উচিত এটি সম্ভব সংক্ষিপ্ততম বাইট গণনায় করা। বিল্টিনগুলি অনুমোদিত।
  • স্ট্যান্ডার্ড গল্ফিং লুফোলগুলি প্রয়োগ হয় - আপনি বাহ্যিক ফাইলগুলি থেকে মার্সেন প্রাইমগুলি পড়তে বা আপনার প্রোগ্রামে হার্ডকোড করতে পারবেন না।
  • আপনার প্রোগ্রামের আপনার ভাষার স্ট্যান্ডার্ড পূর্ণসংখ্যার আকারের মানগুলির জন্য কাজ করা উচিত।

পরীক্ষার মামলা

রেফারেন্সের জন্য, (পরিচিত) মার্সেন প্রাইমের একটি তালিকা এখানে পাওয়া যাবে । কিছু সহজ পরীক্ষার কেস হ'ল:

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

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

শুভ বড়দিন সবাই! আপনি উদযাপন করুন যাই হোক না কেন, একটি দুর্দান্ত ছুটি কাটান :)


2
যদি আমি এটি ইএসপ্রাইম চ্যালেঞ্জের দ্বিগুণ হিসাবে ভোট দিতে পারতাম , কারণ এটি সত্যিই নতুন কিছু যুক্ত করে না।
flawr

9
@ ফ্লোয়ার তারা খুব একই রকম - তবে এই চ্যালেঞ্জের জন্য বিল্টিন হওয়ার সম্ভাবনা কম রয়েছে এবং কোনও সংখ্যার প্রতিনিধিত্বযোগ্য কিনা তা নির্ধারণ করার জন্য প্রচুর আকর্ষণীয় পন্থা রয়েছে2^n-1
ফ্লিপট্যাক

1
আমি বিশ্বাস করি যে মার্সেন সংখ্যার সংজ্ঞা এছাড়াও প্রাইম হতে বাধ্যতামূলক করে (এমন একটি শর্ত যা প্রয়োজনীয় হিসাবে প্রমাণিত হয়েছে তবে যথেষ্ট নয়, (২ ^ n) -১ প্রাইম হওয়ার জন্য।)
সুপারজেডি ২২৪

4
@ সুপারজেডি ২২৪ nসর্বদা প্রধান, তবে কিছু পরিবর্তন করে না জেনে, সংজ্ঞাটি এখনও সঠিক।
ফ্লিপট্যাক

2
@ দ্য বিটবাইট হ্যাঁ - যদি আপনি কিছু সম্ভাবনা-ভিত্তিক অ্যালগরিদম প্রয়োগ করেন যা 100% সময় কাজ করে না তবে আপনি এটি পোস্ট করতে পারেন, তবে এটি প্রতিযোগিতামূলক হবে না :)
ফ্লিপট্যাক

উত্তর:


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.

আদনানের উত্তর হিসাবে একই সমস্যা। মোথেরেফ.ইন.
কেলি

8
@ কেলিলাউডার যা বাইট কাউন্টারে ইউটিএফ -8 ব্যবহার করে। জেলি এবং 05AB1E উভয়ই একক বাইট অক্ষর সেট ব্যবহার করে।
ডেনিস

24

05 এ বি 1 ই , 5 বাইট

বাইনারি 2 এন - 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

সিপি -1222 এনকোডিং ব্যবহার করে । এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন


5
আমি ভাবলাম কতক্ষণ অবধি কেউ এই কৌশলটি ব্যবহার না করে :)
ফ্লিপট্যাক

2 2 বাইট নেয়, তাই এটি 6
কেলি লোদার

5
ইউটিএফ -8 এ @ কেলিলাউডার, হ্যাঁ। তবে, 05AB1E ইউটিএফ -8 এনকোডিংয়ের পরিবর্তে সিপি-1252 এনকোডিং ব্যবহার করে।
আদনান

10

পাইথন , 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&nN + 1 এবং n এর বিটওয়াইড এবং এর গণনা করে । যেহেতু এনটি কেবল 1 বিট নিয়ে থাকে যদি এটি মার্সেন সংখ্যা হয় তবে বিটওয়াইজ এবং 0 ফিরে আসবে যদি (এবং কেবলমাত্র যদি) এটি হয়।

  • all(n%i for i in range(2,n))আয় সত্য যদি এবং কেবল যদি এন mod আমি সব মানের জন্য অ শূন্য হয় আমি[2, ..., এন - 1] , অর্থাত, যদি এবং কেবল যদি এন বাদে কোন ইতিবাচক ভাজক আছে 1 এবং এন

    অন্য কথায়, সব আয় সত্য যদি এবং কেবল যদি এন একটি যৌগিক সংখ্যা, অর্থাত্, এন পারেন হয় 1 বা একটি মৌলিক।

  • n স্ব-ব্যাখ্যামূলক।

শৃঙ্খলাবদ্ধ তুলনা যদি সত্য হয় এবং শুধুমাত্র পৃথক তুলনাগুলি একই কাজ করে তবে তা প্রত্যাশা করে।

  • যেহেতু সব আয় হয় সত্য / 1 বা মিথ্যা / 0 , -~n&n<all(n%i for i in range(2,n))শুধুমাত্র আসতে পারেন সত্য যদি -~n&nউৎপাদনের 0 (অর্থাত, যদি এন একটি Mersenne সংখ্যা হয়) এবং সব আয় সত্য (অর্থাত, যদি এন পারেন 1 বা একটি মৌলিক)।

  • তুলনা all(n%i for i in range(2,n))<nহ'ল যখনই এন> 1 রাখে , তবে যেহেতু সমস্ত রিটার্নটি সত্য হয় যদি এন = 1 হয় , তবে এটি এই ক্ষেত্রে ধরে রাখে না।


1
বাহ, এটি আশ্চর্যজনক :)
ABCDexter

8

ব্র্যাচল্যাগ , 7 বাইট

#p+~^h2

এটি অনলাইন চেষ্টা করুন!

একজন Brachylog প্রোগ্রাম মূলত সীমাবদ্ধতার যা একটি চেইন গঠন একটি ক্রম: প্রথম বাধ্যতা ইনপুট এবং একটি বেনামী অজানা মধ্যে আছে (আসুন একে ডাকতে একজন এই আলোচনার উদ্দেশ্যে), দ্বিতীয় বাধ্যতা যে বেনামী অজানা এবং দ্বিতীয় বেনামী মধ্যে অজানা (যাকে আমরা বি বলব ), এবং আরও অনেক কিছু। এর মতো প্রোগ্রামটি এইভাবে ভেঙে যায়:

#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

এই সমস্ত প্রতিবন্ধকতাগুলি একই সাথে সন্তুষ্ট হতে পারে কেবল যদি বি 2 এর শক্তি হয় তবে ইনপুটটি 2 বিয়োগ 1 এর শক্তি এবং ইনপুটটিও প্রধান। (Brachylog সমাধানকারী অভ্যন্তরীণভাবে একটি বাধ্যতা ব্যবহার করে, তাই প্রোগ্রাম মূল্যায়ন অর্ডার হচ্ছে অদক্ষ হতে করা হবে না এটি জেনে রাখুন যে হবেন Cফর্ম হল [2, Y]আগেই প্রকাশ করার চেষ্টা করে Bদুটি সংখ্যার exponentiation যেমন।)

মজার ব্যাপার হচ্ছে, #p+~^ প্রায় কাজ করে, কারণ মার্সেনের মতো প্রাইমগুলি কেবল অবনতিযুক্ত ক্ষেত্রে ( প্রমাণ ) ভিত্তি হিসাবে 2 ব্যবহার করতে পারে তবে ক) এটি বি -1 হিসাবে বি প্রকাশ করা যেতে পারে বলে নন-মের্সেন প্রাইমস বি -1 এর ক্ষেত্রে ব্যর্থ হয় and ) বিদ্যমান ব্র্যাচিয়েলগ অনুবাদককে এমন একটি প্রোগ্রাম দ্বারা বিভ্রান্ত বলে মনে হচ্ছে (অসীম, বা কমপক্ষে দীর্ঘমেয়াদী, লুপে যাওয়া) যা খুব কমই সীমাবদ্ধ। সুতরাং ব্রাচাইলেজে 7 বাইট পিটানোর সম্ভাবনা কম বলে মনে হচ্ছে।


আমি অভিভূত! অসীম লুপ সমস্যা হিসাবে, এটি পূর্বাভাসের ওভারলোডিংয়ের কারণে। পিছনে ফিরে আমি মনে করি আমার পূর্বাভাস দেওয়ার জন্য কোনও ওভারলোডিং বাস্তবায়ন করা উচিত হয়নি। এটি ফিনাল এর মতো জিনিসগুলিতেও সমস্যা সৃষ্টি করে।
ফ্যাটালাইজ করুন

7

গণিত 26 বাইট

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

এই প্রমাণ দেখুন

কোনও বিজোড় নিখুঁত সংখ্যা না থাকলে এতক্ষণ কাজ করে এবং কারও অস্তিত্বই জানা যায় না।


সুতরাং আপনার উত্তর বৈধ হতে প্রমাণিত হয় না?
জোনাথন ফ্রেচ

আমি মনে করি না যে স্থানটি প্রয়োজনীয়।
জোনাথন ফ্রেচ

@ জোনাথানফ্রেচ সূত্রটি n(n+1)/2যখনই nমার্সেন প্রাইম (ইউক্যালিড) হয় তখন সঠিক সংখ্যা তৈরি করে (এমনকি )। কোনও বিজোড় নিখুঁত সংখ্যার ফর্ম থাকতে n(n+1)/2পারে, অর্থাত্ ত্রিভুজাকৃতির সংখ্যা কিনা তা অজানা বলে মনে হচ্ছে । সমস্ত এমনকি নিখুঁত সংখ্যাগুলি ত্রিভুজাকার যেখানে nএটি একটি মার্সেন প্রাইম (ইউরার)।
জেপ্প স্টিগ নীলসেন

1
@ জেপ্পস্টিগনিয়েলসন প্রশ্নটি হ'ল যদি কারও সমাধানের ভিত্তিতে কোনও অজানা তথ্য ব্যবহার করা বৈধ কিনা?
জোনাথন ফ্রেচ

7

গণিত, 29 26 বাইট

সম্পাদনা করুন: মার্টিন ইন্ডারকে 3 বাইট সংরক্ষণ করা হয়েছে

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

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

আমার সন্দেহ হয় যেহেতু প্রথমটি 42 টি এক্সপোটেন্টগুলি হার্ড-কোডেড রয়েছে:

MersennePrimeExponentQ@Log2[#+1]&

6
PrimeQ@#&&1>BitAnd[#,#+1]&
মার্টিন এন্ডার

5

পার্ল 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

}

যেহেতু পার্ল 6 এ ইচ্ছামত বড় ইনটস রয়েছে তাই এটি এস এর .base(2)সাথে সামনের প্যাড দেয় না 0


5

পাইথন, 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

পাইথন 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

এই ফাংশনটি লুকাস – লেহারের আদিমতার পরীক্ষাটি কার্যকর করে , তাই এটি অন্যান্য পাইথন অফারগুলির মতো সংক্ষিপ্ত না হলেও বিশাল ইনপুটগুলি পরিচালনা করার ক্ষেত্রে এটি আরও দ্রুত।


পাইথন 2 বা পাইথন 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

এফডব্লিউআইডাব্লু, এখানে এর আরও কিছুটা দক্ষ সংস্করণ রয়েছে 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

আপনি
উইল

পুনঃটুইট ধন্যবাদ! আমি কেন জানি না যে আমি সত্যিই তা জানি না ... এবং আমি কেবল লক্ষ্য করেছি যে আমি পাইথন ২ এ ফিরে গিয়ে আরও কয়েকটি বাইট
ছাঁটাই করতে পারি

4

আর, 41 40 বাইট

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

অদ্ভুতভাবে যথেষ্ট পরিমাণে বিল্টিনটি যুক্তি হিসাবে mersenneগ্রহণ nকরে, না 2^n-1

এটি xস্টাডিআইএন থেকে নেওয়া হয়, matlabপ্যাকেজটি ব্যবহার করে এটি প্রাইম কিনা তা পরীক্ষা করে এবং 2-লগের x+1সম্পূর্ণ সংখ্যাটি মোড 1 নিয়ে এবং 'শূন্য-নেস নয়' অনুসন্ধান করে পরীক্ষা করে।

এছাড়াও, আপনি যদি mersenneবিল্টিন ব্যবহার করেন তবে এটি কিছুটা খাটো হয়ে গেলেও প্রতারণার মতো মনে হয়:

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

@ বিলিওউবকে ধন্যবাদ 1 বাইট সংরক্ষিত


অনুরূপ উত্তর পোস্ট করেছে তবে আমি এখন এটি মুছে ফেললাম। আমি matlab::isprimeএকটি বাইট সংরক্ষণ করার পরামর্শ দিতে পারেন। এছাড়াও আপনাকে <-ইন-ফাংশন অ্যাসাইনমেন্টের জন্য ব্যবহার করতে হবে ।
বিলিউব

@ বিলিউব ঠিক ততক্ষণে লক্ষ্য করেছেন যে মতলব :: ইসপ্রাইমটি ছিল 1 বাইট ছোট। (আপনার সমাধানে 1 সেকেন্ড শিখর পেয়েছে)।
জেএডি

log2(x+1)পরিবর্তে আপনি ব্যবহার করতে পারেন log(x+1,2)
বিলিউব


2

আসলে , 9 বাইট

;├╔'1=@p*

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা:

যেহেতু ফর্ম 2 এন -1 এর প্রতিটি সংখ্যার বাইনারি উপস্থাপনায় সমস্ত 1 রয়েছে তাই একটি মার্সেন প্রাইম সেই মানের সাথে একটি প্রধান সংখ্যা হিসাবে চিহ্নিত হতে পারে।

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

2

জেলি, 5 বাইট

@ ডেনিসের বিদ্যমান 5-বাইট জেলি উত্তরটির বিকল্প পদ্ধতি:

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

যেহেতু একজন মার্সেন প্রাইম 2 পাওয়ার চেয়ে কম, তাই এর বাইনারি উপস্থাপনাটি মজাদারভাবে 1 এর। এরপরে আউটপুটটি মরসেন প্রাইমসের জন্য 1 এবং অন্যান্য ক্ষেত্রে 0 হয়।


2

সিলোন, 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;

প্রতারণার মাধ্যমে (সিলোনগুলির পূর্ণসংখ্যার পরিসীমাতে ফলাফলগুলি হার্ডকোডিং করা), আমরা একটি বাইট সংক্ষিপ্ত (65) পেতে পারি:

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

(দেখে মনে হচ্ছে সিনট্যাক্স হাইলাইটার সিলোনির হেক্স সংখ্যাকে মন্তব্য-প্রারম্ভিক হিসাবে ভুল বোঝায়))

যদি কোনও বেনামি ফাংশন ঠিক থাকে, তবে এটি 49 বাইট:

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

2

ওল্ফ্রাম ভাষা (গণিত) , 23 বাইট

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

এটি অনলাইন চেষ্টা করুন!

1 সঠিকভাবে পরিচালিত হয় কারণ PrimeQ[BitAnd[1,1+2]*1] == PrimeQ@1 == False। অন্যথায়, BitAnd[#,#+2]#প্রধান হওয়ার জন্য , আমাদের #এটি প্রধান এবং প্রয়োজনটি BitAnd[#,#+2] == 1যখন #একটি মার্সেন সংখ্যা হয় তখন ঘটে ।


সুন্দরভাবে সম্পন্ন! যিনি কখনও ম্যাথমেটিকাকে ব্যবহার করেন নি, তবে আপনার টিআইও কোডটি প্রথমে বিভ্রান্তিকর ছিল। তখন আমি বুঝতে পেরেছিলাম যে আপনি নিজের ফাংশনটি এনজেনিসিসের পূর্ববর্তী বাঁধা রেকর্ডধারীর সাথে তুলনা করছেন । আমি মনে করি এটি কেবলমাত্র ফাংশনটির আউটপুট দেখানো ভাল এবং অন্য সমাধানের সাথে তুলনা করার জন্য একটি দ্বিতীয় লিঙ্ক থাকতে পারে link
ডেডকোড

2

ECMAScript রেজেেক্স, 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 বাইট নিচে ধন্যবাদ।

বেসিক "2 বিয়োগ 1 এর শক্তি" পরীক্ষাটি হয় ^(x(x*)(?=\2$))*$। এটি অপারেশনটি "বিয়োগ 1 টি লুপ করে কাজ করে, তারপর 2 দিয়ে সমানভাবে ভাগ করুন" যতক্ষণ না এটি আর করা না যায়, তারপরে ফলাফলটি শূন্য বলে দাবি করে। এই শুধুমাত্র সংখ্যা ≥1 গত পরিবর্তন করে মেলে পরিবর্তন করা যাবে *একটি থেকে +, একবার অন্তত পুনরুক্তি করতে লুপ অত্যাচার। xসর্বশেষের আগে একটি সন্নিবেশ করানো হলে $এটি কেবলমাত্র numbers3 সংখ্যার সাথে মিলিত হওয়ার জন্য এটি পরিবর্তিত করে যে কমপক্ষে একবার লুপ করার পরে চূড়ান্ত ফলাফল 1 হয়।

সম্পর্কিত "পরীক্ষা 2 পাওয়ার একটি" হয় ^((x+)(?=\2$))*x$। এছাড়া 2 বিয়োগ 2 মিলে ক্ষমতা, আবিষ্কৃত জন্য একটি সাঁটে লেখার হয় ময়লা : ^((x+)(?=\2$)x)*$। এই রেজেক্সগুলির তিনটিই একই দৈর্ঘ্যের।

গ্রিমির বিকল্প 31 বাইট সংস্করণ :

^(?!(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
2 পাওয়ার চেয়ে কম 1 নম্বর জন্য সরাসরি পরীক্ষা করে 11 বাইট সংরক্ষণ করুন: এটি অনলাইনে চেষ্টা করুন!
নীল

@ নীল আপনাকে অনেক ধন্যবাদ! আমি ইচ্ছা করি আমি এটি ভাবতাম, তবে তারপরে, আমি ঠিক এটিই ঘটতে চাইছিলাম!
ডেডকোড

1
আসলে এটুকু x(x+)(?=\3$)ভাবলে কি আরও কিছুটা দক্ষ হবে?
নীল

হ্যাঁ, আপনি ঠিক বলেছেন।
ডেডকোড

2

রেজেক্স (ECMAScript), 29 বাইট

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

এটি অনলাইন চেষ্টা করুন!

মধ্যে ময়লা দ্বারা অনুপ্রাণিত চ্যাট

রেজেক্স জোর দিয়েছিলেন যে ইনপুটটি 3 এর চেয়ে বেশি, এবং এটি কোনওরূপ নয়: (xx+)\1+বা ((xx)+)(\1x)+

প্রথম মিলিত সংমিশ্রণ সংখ্যা।
দ্বিতীয়টি এমন একটি সংখ্যার সাথে মেলে যা 2 এর চেয়ে বেশি কিছু বিজোড় সংখ্যার একাধিকের চেয়ে 1 কম।

01
2এন-1

যেহেতু 2 হ'ল একমাত্র প্রাইম যা বিজোড় প্রাইমের চেয়ে 1 কম, নেতিবাচক চেহারাটি একসাথে যে ইনপুটটি 3 এর চেয়ে বেশি, কেবলমাত্র মের্সেন প্রাইমগুলির সাথে মিলবে।




1

পাইথন, 65 বাইট

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

প্রস্থান কোডের মাধ্যমে আউটপুট। মিথ্যা জন্য পুনরাবৃত্তি ত্রুটি। সত্যের জন্য কোনও ত্রুটি নেই।

কিভাবে এটা কাজ করে

যেহেতু 2^n-1বাইনারি পুরোপুরি 1 এর থেকে তৈরি হয়, তাই পরবর্তী 2^n-1সংখ্যাটি তৈরি করতে পারে number|number+1

এই ফাংশনটি প্রতিটি 2^n-1সংখ্যার পুনরাবৃত্তি করে পরীক্ষা করে এটি ব্যবহার করে যে এটি কোনও প্রাথমিক সংখ্যা এবং ইনপুটটিতে একাউল রয়েছে কিনা তা ব্যবহার করে এটি ব্যবহার করে । যদি সংখ্যাটি মার্শেন প্রাইম না হয় তবে পাইথন অবশেষে ত্রুটি ছুঁড়ে দেবে কারণ সর্বোচ্চ পুনরাবৃত্তির গভীরতা অতিক্রম করা হত।


1
যদি আমার ভুল না হয় তবে <0~> 0>
জোনাথন ফ্রেচ

1

পুশি , 7 বাইট

oBoIpP#

এটি অনলাইন চেষ্টা করুন!

এটি মার্শেন সংখ্যায় কেবল তাদের বাইনারি উপস্থাপনায় থাকে তার সুবিধাটি নেয়:

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যদি সংখ্যাকে বাইনারি উপস্থাপনা কোন শূণ্যসমূহ আছে, এবং তার primality হয় True


1

পাইথ , 8 বাইট

&.AjQ2P_

সমস্ত পরীক্ষার কেস যাচাই করুন।

পাইথ , 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 এন - 1 ফর্মের একটি সংখ্যা বাইনারিতে যখন লেখা হয় কেবল সর্বদা 1 থাকে । সুতরাং, আমরা পরীক্ষা করি যে এর সমস্ত বাইনারি সংখ্যা 1 এবং এটি প্রধান কিনা is

কোড ব্রেকডাউন # 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 দুটি পাওয়ার (যেমন এটি মার্সেন সংখ্যা হয়) হয় তবে এই পরীক্ষা করে এবং তারপরে প্রাথমিকতা পরীক্ষা করে। পাইথনে boolএটি একটি সাবক্লাস int, সুতরাং সত্যবাদীটিকে 1 হিসাবে গণ্য করা হয় এবং মিথ্যাটিকে 0 হিসাবে গণ্য করা হয় । একটি 0 এবং অপরটি 1 হ'ল স্পষ্টভাবে পরীক্ষা করা এড়াতে আমরা তাদের মানগুলি ব্যবহার করে তুলনা করি <(যেহেতু আমাদের কেবল 1 টির মতো কেস রয়েছে)।


1

জাভা 8, 53 52 49 বাইট

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

বাগ-ফিক্সড এবং গল্ফ করা 4 বাইট বাই নেভায় ধন্যবাদ ।

ব্যাখ্যা:

এখানে চেষ্টা করুন।

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প্রতিটি মেসেন্ন প্রাইমস, 56 বাইটের জন্যই নয়, প্রতিটি প্রধান 2 এর জন্য ফিরে আসে :n->{for(int i=2;i<n;n&=-n%i++>>-1);return(n&n+1)<1&n>2;}
নেভায়ে

1
52 বাইট:n->{int i=1;for(;++i<n&n%i>0;);return(n&n+1|i^n)<1;}
নেভায়ে

@ নেভে ধন্যবাদ .. এবং কেন নিশ্চিত নয় যে কেন পরীক্ষার মামলায় এমন কোনও প্রাইম অন্তর্ভুক্ত করা হয়নি যা মের্সেন প্রাইম নয় .. এগুলি নিজেই যুক্ত করেছিলাম, এবং আপনি সত্যই সঠিক ছিলেন।
কেভিন ক্রুইজসেন

1
49 বাইট:n->{int i=1;for(;n%++i>0;);return(n&n+1|i^n)==0;}
নেভায়ে

1

পাইথন 3, 68 বাইট

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

এখানে চেষ্টা করুন

পাইথন 2, 63 বাইট

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

এখানে চেষ্টা করুন


জনাথন পরামর্শের জন্য ধন্যবাদ


বাইকাউন্ট হ্রাস করার জন্য কোনও পরামর্শের জন্য উন্মুক্ত করুন।




0

পাইথন, 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

এই কোডটি পাইথন 2 এবং পাইথন 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

পিএইচপি, 53 বাইট

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

কমান্ড লাইন আর্গুমেন্ট গ্রহণ; 1Mersenne 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

সি, 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 প্রদান করে, অন্যথায় 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। আপনি সহজেই মধ্যে একটি STRING "162259276829213363391578010288127" (2 ** 107-1 একটি Mersenne মৌলিক হয়) রূপান্তর করতে পারেন 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ফাংশন।
মিল্কিওয়ে 90

0

পার্ল 5 , 53 বাইট

52 কোডের বাইট +1 এর জন্য -p

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

এটি অনলাইন চেষ্টা করুন!


মেটা -psensকমত্য অনুসারে, এইটিকে অন্য প্রোগ্রামিং ভাষা হিসাবে শ্রেণীবদ্ধ করা হয়েছে, এবং তাই আপনার বাইটকাউন্টে গণনা করা হয় না।
মিল্কিওয়ে 90
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.