सबसे बड़ा नाजुक प्रधान खोजें


21

उस फ़ंक्शन पर विचार करें जो अंकों को स्थिति से शुरू होने वाली संख्या से Remove(n, startIndex, count)हटाता है । उदाहरण:countnstartIndex

Remove(1234, 1, 1) = 234
Remove(123456, 2, 3) = 156
Remove(1507, 1, 2) = 07 = 7
Remove(1234, 1, 4) = 0

हम प्राइम नंबर X को नाजुक कहेंगे यदि हर संभव Removeऑपरेशन इसे गैर-प्रमुख बनाता है। उदाहरण के लिए, 80651 एक नाज़ुक प्राइम है क्योंकि निम्नलिखित सभी संख्याएँ प्राइम नहीं हैं:

651, 51, 1, 0, 8651, 851, 81, 8, 8051, 801, 80, 8061, 806, 8065

लक्ष्य

एक प्रोग्राम लिखें जो सबसे बड़ा नाजुक प्राइम पाता है। संपादित करें: समय सीमा को हटा दिया क्योंकि इसे दरकिनार करने का अपेक्षाकृत उचित तरीका था।

स्कोर आपके प्रोग्राम द्वारा पाया जाने वाला नाजुक प्राइम नंबर है। एक टाई होने की स्थिति में, पहले वाला सबमिशन जीत जाता है।

नियम

  • आप किसी भी भाषा और किसी भी तृतीय-पक्ष लाइब्रेरी का उपयोग कर सकते हैं।
  • आप अपने स्वयं के हार्डवेयर पर प्रोग्राम चलाते हैं।
  • आप संभावित संभाव्यता परीक्षणों का उपयोग कर सकते हैं।
  • सब कुछ बेस 10 में है।

अग्रणी प्रविष्टियाँ

  • क्वालटाग (जावा) द्वारा 6629 अंक
  • एमिल (पायथन 2) द्वारा 5048 अंक
  • जकुबे द्वारा 2268 अंक (पायथन 2)

संपादित करें: मैंने अपना जवाब जोड़ दिया है।

  • क्वालोपाग के एल्गोरिथ्म (C #) के आधार पर, सबोप्टिमस प्राइम द्वारा 28164 अंक

5
यहां तक ​​कि अगर मैं जवाब को हार्ड कोड नहीं करता हूं, तो मैं एक बड़े नाजुक प्राइम के बहुत करीब एक बिंदु पर खोज शुरू कर सकता हूं । जाहिर है, कोई भी खोज शुरू नहीं करना चाहता है। 1. मुझे ऐसा करने से क्या रोक रहा है? वास्तव में उत्तर के हार्ड-कोडिंग के लिए बाहर निकलने से पहले मैं अपनी खोज कितने करीब से शुरू कर सकता हूं? मुझे चुनौती पसंद है।
रेनबोल्ट

2
@SuboptimusPrime आप इसके बजाय समय सीमा पूरी तरह से हटा सकते हैं, क्योंकि मेरा मानना ​​है कि कुछ बिंदु पर ऐसा बहुत कम होगा कि यह अगले एक को खोजने के लिए एक उपलब्धि होगी। ( कोडगुल्फ.स्टैकएक्सचेंज.com/questions/41021/… के समान )
मार्टिन


7
आप अभी भी एक नुकसान में रह रहे हैं जिनके पास धीमे कंप्यूटर हैं
जॉन ड्वोरक

11
मुझे यह महसूस करने में बहुत शर्मिंदगी महसूस हुई कि "एक प्रोग्राम लिखें जो सबसे बड़ा नाजुक प्राइम ढूंढता है" का मतलब यह नहीं था कि "सबसे बड़ा नाजुक प्राइम मौजूद है। एक प्रोग्राम लिखें जो इसे ढूंढता है।" मुझे लगता है कि मैंने बहुत अधिक प्रोजेक्ट यूलर किया है। :-P
बजे

जवाबों:


9

जावा - 3144 3322 6629 अंक

6 0{3314} 8969999

6 0{6623} 49099

यह समाधान FryAmTheEggman के उत्तर पर आधारित है ।

  1. अंतिम अंक 1 या 9 है।
  2. यदि अंतिम अंक 1 है तो एक पिछला अंक 0, 8 या 9 है।
  3. यदि अंतिम अंक 9 है तो एक पिछला अंक 0, 4, 6 या 9 है।
  4. ...

अगर हम गहरी खुदाई करें तो क्या होगा?

यह एक वृक्ष संरचना बन जाता है:

                        S
             -----------------------
             1                     9
    ------------------         ----------------
    0           8    9         0    4    6    9
---------     -----
0   8   9      ...

यदि R और उसके सभी अंत संमिश्र हैं, तो नंबर R को सही कंपोजिट कहें।

हम चौड़ाई-प्रथम तरीके से सभी सही समग्र संख्याओं पर पुनरावृत्ति कर रहे हैं: 1, 9, 01, 81, 91, 09, 49, 69, 99, 001, 801, 901 आदि।

शून्य से शुरू होने वाली संख्याओं को चुम्बकत्व के लिए जाँच नहीं की जाती है, लेकिन आगे की संख्या बनाने के लिए आवश्यक हैं।

हम फॉर्म X00 ... 00R में एक लक्ष्य संख्या N की तलाश करेंगे, जहां X 4, 6, 8 या 9 में से एक है और R सही सम्मिश्र है। X प्रधान नहीं हो सकता। X 0. नहीं हो सकता है और X 1 नहीं हो सकता है क्योंकि यदि R 1 या 9 के साथ समाप्त होता है तो N में 11 या 19 होंगे।

यदि "हटाने" ऑपरेशन के बाद XR में अभाज्य संख्याएँ हैं, तो XYR में उन्हें भी किसी भी Y के लिए शामिल किया जाएगा।

X को स्थिर रहने दें, 6 कहें।

स्यूडोकोड:

X = 6;
for ( String R : breadth-first-traverse-of-all-right-composites ) {
  if ( R ends with 1 or 9 ) {
    if ( remove( X + R, i, j ) is composite for all i and j ) {
      for ( String zeros = ""; zeros.length() < LIMIT; zeros += "0" ) {
        if ( X + zeros + R is prime ) {
          // At this step these conditions hold:
          // 1. X + 0...0 is composite.
          // 2. 0...0 + R = R is composite.
          // 3. X + 0...0 + R is composite if 0...0 is shorter than zeros.
          suits = true;
          for ( E : all R endings )
            if ( X + zeros + E is prime )
              suits = false;
          if ( suits )
            print R + " is fragile prime";
          break; // try another R
                 // because ( X + zeros + 0...0 + R )
                 // would contain prime ( X + zeros + R ).
        }
      }
    }
  }
}

हमें शून्य मात्रा को सीमित करना चाहिए क्योंकि X + शून्य + R के रूप में एक अभाज्य संख्या ज्ञात करने में बहुत लंबा समय लग सकता है (या हमेशा के लिए यदि वे सभी संयुक्त हैं)।

असली कोड काफी क्रिया है और यहां पाया जा सकता है

लंबी अंतर सीमा में संख्याओं के लिए परिक्षण परीक्षण मिलर परीक्षण के निर्धारक संस्करण द्वारा किया जाता है। BigInteger नंबरों के लिए एक ट्रायल डिवीजन पहले किया जाता है और फिर BailliePSW टेस्ट। यह संभाव्य है, लेकिन काफी निश्चित है। और यह मिलर-राबिन परीक्षण की तुलना में तेज़ है (हमें मिलर-राबिन में इतनी बड़ी संख्या के लिए कई पुनरावृत्तियां करनी चाहिए ताकि अधिक सटीकता प्राप्त हो सके)।

संपादित करें: पहला प्रयास गलत था। हमें R से शुरू होने वाली शाखाओं को भी अनदेखा करना चाहिए अगर X0 ... 0R प्राइम है। फिर X0 ... 0YR प्राइम प्राइम नहीं होगा। इसलिए एक अतिरिक्त जाँच जोड़ी गई। यह समाधान सही प्रतीत होता है।

2 संपादित करें: एक अनुकूलन जोड़ा। यदि (X + R) 3 से विभाज्य है तो (X + zeros + R) भी 3 से विभाज्य है। इसलिए (X + zeros + R) इस मामले में अभाज्य नहीं हो सकता है और ऐसे R को छोड़ दिया जा सकता है।

संपादित करें 3: यदि वे अंतिम या पहली स्थिति में नहीं हैं, तो मुख्य अंकों को छोड़ना आवश्यक नहीं था। तो 21 या 51 जैसे एंडिंग ठीक हैं। लेकिन यह कुछ भी नहीं बदलता है।

निष्कर्ष:

  1. मेरा अंतिम उत्तर 100 मिनट के लिए नाजुक होने की जाँच कर रहा था। उत्तर की खोज (सभी पूर्ववर्ती वेरिएंट की जाँच) में लगभग 15 मिनट लगे। हां, खोज समय को प्रतिबंधित करने का कोई मतलब नहीं है (हम लक्ष्य संख्या से खोज शुरू कर सकते हैं, इसलिए समय शून्य होगा)। लेकिन इस प्रश्न की तरह जाँच के समय को सीमित करना सार्थक हो सकता है ।
  2. उत्तर 60 ... 049099 के मध्य में अंक 4 है। यदि "हटाएं" ऑपरेशन इसे छूता है, तो संख्या 3 से विभाज्य हो जाती है। इसलिए हमें हटाए गए संचालन को बाएं और दाएं पक्षों में जांचना चाहिए। राइट साइड बहुत छोटा है। बाईं ओर की लंबाई लगभग n = लंबाई (N) है।
  3. बीपीएसडब्ल्यू और मिलर-राबिन जैसे प्राइमलिटी परीक्षण मॉड्यूलर एक्सपोनेंशिएशन की निरंतर मात्रा का उपयोग करते हैं। इस पृष्ठ के अनुसार इसकी जटिलता O (M (n) * n) है , जहाँ M (n) गुणन जटिलता है। जावा Toom-Cook और Karatsuba एल्गोरिदम का उपयोग करता है, लेकिन हम सरलता के लिए विद्वान एल्गोरिथ्म लेंगे। एम (एन) = एन 2 । तो परिक्षण परीक्षण जटिलता O (n 3 ) है।
  4. हमें लंबाई = 6 से 6629 तक सभी नंबरों की जांच करनी चाहिए। आइए सामान्यता के लिए न्यूनतम = 1 और अधिकतम = n लें। संपूर्ण जांच जटिलता ओ (1 3 + 2 3 + ... + n 3 ) = O ((n * (n + 1) / 2) 2 ) = O (n 4 ) है।
  5. एमिल के जवाब में एक ही चेकिंग एसिम्पोटिक्स है। लेकिन स्थिर कारक कम है। अंक "7" संख्या के बीच में खड़ा है। लेफ्ट साइड और राइट साइड लगभग बराबर हो सकते हैं। यह (n / 2) 4 * 2 = n 4 / 8. स्पीडअप: 8X देता है। फॉर्म 9 ... 9Y9 ... 9 की संख्या X0 ... 0R की तुलना में 1.7 गुना अधिक हो सकती है।

1
क्रेडिट के लिए धन्यवाद, लेकिन आपका एल्गोरिथ्म मेरी तुलना में बहुत अधिक जटिल है! महान काम, और PPCG में आपका स्वागत है! :)
फ्राइअमईएग्गमैन

@FryAmTheEggman: विचार के लिए धन्यवाद! यह प्रेरणादायक है।
क्वालटैग

चेक की जटिलता का आपका विश्लेषण बहुत दिलचस्प है, लेकिन खोज संकलन शायद महत्वपूर्ण भी है। मुझे लगता है कि एक बड़े नाजुक प्राइम को खोजने के लिए आपके एल्गोरिथ्म को बड़ी संख्याओं (एमिल की तुलना में) की काफी कम परिक्षण परीक्षणों की आवश्यकता होती है। और आप एक देशी पुस्तकालय का उपयोग करके मौलिकता परीक्षणों की गति बढ़ा सकते हैं। मैं Mpir.NET का उपयोग कर रहा हूं, और एक नाजुक प्रधानमंत्री होने के लिए आपके नंबर की जांच करने में कुछ ही मिनट लगते हैं।
सबॉप्टिमस प्राइम

13

पायथन 2 - 126 1221 1337 1719 2268 अंक

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999799999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

'9' * 1944 + '7' + '9' * 323

निकालें (n, startIndex, count) के 2 परिणामी संख्या len (n) के बारे में हैं। मैंने उन नंबरों को कम करने की कोशिश की। यदि एक दूसरे के बगल में बहुत सारे अंक हैं, तो इनमें से बहुत से परिणामी संख्याओं को अनदेखा किया जा सकता है, क्योंकि वे कई बार दिखाई देते हैं।

तो मैं इसे चरम पर ले गया, केवल 9s और बीच में थोड़ा प्राइम। मैंने 1 मिलियन से कम के नाज़ुक प्राइम पर भी नज़र डाली, और देखा, कि ऐसे नाज़ुक प्राइम हैं। अंत में 2 9s के साथ संख्याओं की खोज करना वास्तव में अच्छा काम करता है, निश्चित नहीं कि क्यों। 1 नंबर, 3, या 4 9 s छोटे नाजुक प्राइम में परिणाम देता है।

यह pyprimes मॉड्यूल का उपयोग करता है । मुझे यकीन नहीं है, अगर यह किसी भी अच्छा है। यह मिलर_राबिन परीक्षण का उपयोग करता है, इसलिए यह संभाव्य है।

इस कार्यक्रम में लगभग 1 मिनट में यह 126 अंकों का नाजुक प्राइम है, और बाकी समय यह सफलता के बिना खोजता है।

biggest_found = 80651

n = lambda a,b,c: '9'*a + b + '9'*c

for j in range(1000):
   for digit in '124578':
      for i in range(2000):
         number = int(n(i,digit,j))
         if is_prime(number):
            if (number > biggest_found):
               if all(not is_prime(int(n(i,digit,k))) for k in range(j)):
                  biggest_found = number
                  print(i+j+1, biggest_found)
            break

संपादित करें:

बस देखा, कि आपने समय सीमा निकाल दी। मैं रात भर कार्यक्रम चलाऊंगा, हो सकता है कि वास्तव में कुछ बड़े नाजुक प्राइम दिखाई दें।

2 संपादित करें:

मेरे मूल कार्यक्रम को और तेज कर दिया है, लेकिन फिर भी 126 से अधिक अंकों के साथ कोई समाधान नहीं है। इसलिए मैंने ट्रेन पर छलांग लगाई और x 9s + 1 अंक + y 9s की खोज की। लाभ यह है, कि आपको y को ठीक करने के लिए, आपको primality के लिए O (n) संख्याओं की जांच करनी होगी। यह एक 1221 पाता है बल्कि जल्दी।

3 संपादित करें:

2268 अंकों की संख्या के लिए मैं एक ही कार्यक्रम का उपयोग करता हूं, केवल कई कोर पर काम को विभाजित किया है।


3
"लगभग 1 मिनट में" - क्षमा करें, एक बहुवचन "बग" को रिपोर्ट करना होगा। : पी
23

मिलर-राबिन की संभावित प्रकृति वह है जो मुझे मेरी पिछली कुछ प्रविष्टियों के लिए काट रही थी। आप किसी अन्य एल्गोरिथ्म के साथ भी सत्यापित करना चाह सकते हैं।
जॉन मेकाहम

आप केवल यह क्यों जाँचते हैं कि अंकों को अंत से हटाने से बनी संख्याएँ संयुक्त हैं? सामने से अंकों को हटाकर गठित संख्याओं की जांच क्यों नहीं की गई?
isaacg

1
क्योंकि मैंने इससे पहले 'फॉर आई-लूप' में चेक किया था। यहां मैं शुरुआत में 9s जोड़ता हूं, और एक प्रमुख जांच करता हूं। जब मुझे इस फॉर्म का पहला प्राइम नंबर मिलता है, तो मुझे पता है, कि शुरुआत में कम 9s वाले सभी नंबर प्राइम नहीं हैं। और अंत में 9s को हटाने के लिए जाँच करने के बाद, मैं रुक जाता हूं (विराम), क्योंकि अब, प्रत्येक संख्या में एक अभाज्य संख्या है और इसलिए यह मुख्य है।
जक्यूब

आह, बहुत चालाक।
२०:४४ को २०:४४ में isaacg

7

पायथन 2.7 - 429623069 99993799

अब तक कोई अनुकूलन नहीं। बस नाजुक छंदों के बारे में कुछ तुच्छ टिप्पणियों का उपयोग करना (चैट में रेनबोल्ट के लिए धन्यवाद):

  1. Fragile primes 1 या 9 में समाप्त होने चाहिए (Primes भी नहीं हैं, और अंतिम अंक प्रधान नहीं होना चाहिए)
  2. 1 में समाप्त होने वाले नाजुक अपराध 8 या 9 से शुरू होने चाहिए (पहली संख्या अभाज्य नहीं हो सकती, और 11, 41 और 61 और सभी primes हैं)
  3. 9 में समाप्त होने वाले नाजुक अपराध 4,6 या 9 से शुरू होने चाहिए (1 के लिए तर्क देखें, लेकिन केवल 89 अभाज्य हैं)

बस गेंद लुढ़कने की कोशिश कर :)

यह तकनीकी रूप से 15 मिनट से थोड़ा अधिक चलता है, लेकिन यह अतिरिक्त समय में केवल एक नंबर की जांच करता है।

is_primeयहाँ से लिया गया है (isaacg ने इसे यहाँ उपयोग किया है ) और संभाव्य है।

def substrings(a):
    l=len(a)
    out=set()
    for i in range(l):
        for j in range(l-i):
            out.add(a[:i]+a[len(a)-j:])
    return out

import time

n=9
while time.clock()<15*60:
    if is_prime(n):
        if not any(map(lambda n: n!='' and is_prime(int(n)), substrings(`n`))):
            print n
    t=`n`
    if n%10==9 and t[0]=='8':n+=2
    elif n%10==1 and t[0]!='8':n+=8
    elif t[0]=='1' or is_prime(int(t[0])):n+=10**~-len(t)
    else:n+=10

बस एक नोट, जब मैं इसे शुरू करता हूं तो मैं n=429623069उठ जाता हूं 482704669। अतिरिक्त रणनीति वास्तव में इस रणनीति को मारने के लिए लगता है ...


एक शुरुआत के लिए बुरा नहीं है! हालांकि ऐसा लगता है कि is_prime 32-बिट मानों के लिए पूर्ण डिटेटेर्मिनिस्टिक चेक करता है, जो थोड़ा अधिक है। मुझे लगता है कि is_prime मेथड तेजी से काम कर सकता है यदि आप पूर्ण परीक्षण डिवीजन भाग को कमेंट करेंगे।
सबोप्टिमस प्राइम

@SuboptimusPrime ओह, धन्यवाद। मैंने इसे देखा भी नहीं: P
FryAmTheEggman

@SuboptimusPrime मुझे लगता है कि पूर्ण निर्धारक जाँच छोटे मूल्यों के लिए तेज़ है क्योंकि लेखक ने उम्मीदवार कारकों के बीच कदम उठाने को परिभाषित किया है। इस विचार के लिए फिर से धन्यवाद, लेकिन यह बहुत तेजी से लगता है जब छोड़ने में :)
FryAmTheEggman

आपके उत्तर के लिए छोटा सुधार: 91 = 13x7, इसलिए 91 समग्र है, और 1 में समाप्त होने वाले नाजुक प्राइम वास्तव में 9 से शुरू हो सकते हैं
सबोप्टिमिअस प्राइम

@SuboptimusPrime काफी सही, पता नहीं कैसे मैंने उसे गड़बड़ कर दिया। मेरे द्वारा पोस्ट किया गया मान अभी भी मान्य होना चाहिए, क्योंकि मैं कुछ संभावित मूल्यों को छोड़ रहा था।
FryAmTheEggman

7

पायथन 2, 828 अंक 5048 अंक

99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999799999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
155*'9'+'7'+4892*'9'

जैसा कि @Jakube ने बताया, मैंने जो पहला प्राइम प्रस्तुत किया था वह वास्तव में मेरे कोड में बग के कारण नाजुक नहीं था। बग को ठीक करना आसान था लेकिन इसने एल्गोरिथम को काफी धीमा बना दिया।

मैंने अपने आप को नाजुक अपराधों के आसानी से खोजे जाने वाले सबसेट तक सीमित कर लिया, अर्थात् वे जो केवल अंक 9 और ठीक एक अंक 7 से मिलकर बने।

def fragile_prime_generator(x, b_max):
  bs, cs = set(), set()
  prime = dict()

  def test_prime(b,c):
    if (b,c) not in prime:
      prime[(b,c)] = is_prime(int('9'*b+`x`+'9'*c))
    return prime[(b,c)]

  def test_frag(b,c):
    for b2 in xrange(b):
      if test_prime(b2,c):
        bs.add(b2)
        return False
    for c2 in xrange(c):
      if test_prime(b,c2):
        cs.add(c2)
        return False
    return True

  a = 1
  while len(bs)<b_max:
    for b in xrange(min(a, b_max)):
      c = a-b
      if b not in bs and c not in cs and test_prime(b,c):
        bs.add(b)
        cs.add(c)
        if test_frag(b,c): yield b,c
    a += 1
  print "no more fragile primes of this form"

for b,c in fragile_prime_generator(7, 222):
  print ("%d digit fragile prime found: %d*'9'+'%d'+%d*'9'"
          % (b+c+1, b, x, c))

मैंने @FryAmTheEggman के रूप में एक ही is_primeफ़ंक्शन ( यहां से ) का उपयोग किया।

संपादित करें:

एल्गोरिथ्म को तेज़ बनाने के लिए मैंने दो बदलाव किए:

  • मैं जितना संभव हो सके उतनी अधिक संभावनाएं छोड़ने की कोशिश करता हूं और केवल तभी वापस जाता हूं जब एक संभावित नाजुक प्राइम को यह सुनिश्चित करने के लिए पाया जाता है कि यह वास्तव में नाजुक है। छोटी संख्या में डुप्लिकेट चेक हैं, इसलिए मैंने मुख्य जाँच फ़ंक्शन को संक्षिप्त रूप से याद किया।

  • फॉर्म की संख्या के लिए b*'9' + '7' + c*'9' मैंने आकार सीमित कर दिया हैb । सीमा कम है, कम संख्या की जाँच की जानी है, लेकिन किसी भी बड़े नाजुक प्राइम को नहीं खोजने के लिए संभावना बढ़ जाती है। मैंने एक तरह की मनमानी को सीमा के रूप में 222 चुना।

कुछ हजार अंकों पर एक एकल प्राइम चेक पहले से ही मेरे कार्यक्रम को कुछ सेकंड ले सकता है। इसलिए, मैं शायद इस दृष्टिकोण के साथ ज्यादा बेहतर नहीं कर सकता।

कृपया मेरी सबमिशन की शुद्धता की जांच करने के लिए स्वतंत्र महसूस करें। संभावित संभाव्यता की जांच के कारण मेरा नंबर सैद्धांतिक रूप से प्रधान नहीं हो सकता है, लेकिन अगर ऐसा है, तो यह नाजुक होना चाहिए। या मैंने कुछ गलत किया है। :-)


2
आपका पाया प्रधानमंत्री नाजुक नहीं है। यदि आप निकालें (n, 83,838) [पहले 82 अंकों को छोड़कर सब कुछ हटा दें], तो आप एक प्राइम के साथ समाप्त हो जाएंगे।
Jakube

1
आह, धन्यवाद @ जाकुब। मैं बहुत चालाक बनने की कोशिश कर रहा था। पता चलता है कि मैं अधिक primality जाँच छोड़ रहा था तो मुझे होना चाहिए। मैं इसे ठीक करने के लिए अपने रास्ते पर हूँ।
एमिल

1
इसे फिर से जांचा, अब आपके परिणाम सही हैं।
जकुबे

आपका 5048 अंकों की संख्या, वास्तव में, मेरे कार्यक्रम के अनुसार एक नाजुक प्राइम है।
सबोप्टिमस प्राइम

@SuboptimusPrime: महान, जाँच के लिए धन्यवाद!
एमिल

4

C #, 10039 28164 अंक

6 0{28157} 169669

संपादित करें: मैंने कुछ मामूली संशोधनों के साथ क्वालटाग के एल्गोरिथ्म पर आधारित एक और कार्यक्रम बनाया है:

  • मैं फॉर्म L000 ... 000R की संख्या खोज रहा हूं, जहां L को समग्र छोड़ दिया गया है, R सही सम्मिश्र है। मैंने बाएं समग्र संख्या L को कई अंक रखने की अनुमति दी, हालांकि यह ज्यादातर एक शैलीगत परिवर्तन है, और यह संभवतः एल्गोरिथ्म की दक्षता को प्रभावित नहीं करता है।
  • मैंने खोज को गति देने के लिए मल्टीथ्रेडिंग जोड़ा है।
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Threading;
using System.Threading.Tasks;
using Mpir.NET;

class Program
{
    const int PrimeNotFound = int.MaxValue;

    private static BitArray _primeSieve;
    private static HashSet<Tuple<int, int>> _templatesToSkip = new HashSet<Tuple<int, int>>();

    static void Main(string[] args)
    {
        int bestDigitCount = 0;
        foreach (Tuple<int, int> template in GetTemplates())
        {
            int left = template.Item1;
            int right = template.Item2;
            if (SkipTemplate(left, right))
                continue;

            int zeroCount = GetZeroCountOfPrime(left, right);
            if (zeroCount != PrimeNotFound)
            {
                int digitCount = left.ToString().Length + right.ToString().Length + zeroCount;
                if (digitCount >= bestDigitCount)
                {
                    string primeStr = left + " 0{" + zeroCount + "} " + right;
                    Console.WriteLine("testing " + primeStr);
                    bool isFragile = IsFragile(left, right, zeroCount);
                    Console.WriteLine(primeStr + " is fragile: " + isFragile);

                    if (isFragile)
                        bestDigitCount = digitCount;
                }

                _templatesToSkip.Add(template);
            }
        }
    }

    private static int GetZeroCountOfPrime(int left, int right)
    {
        _zeroCount = 0;

        int threadCount = Environment.ProcessorCount;
        Task<int>[] tasks = new Task<int>[threadCount];
        for (int i = 0; i < threadCount; i++)
            tasks[i] = Task.Run(() => InternalGetZeroCountOfPrime(left, right));
        Task.WaitAll(tasks);

        return tasks.Min(task => task.Result);
    }

    private static int _zeroCount;

    private static int InternalGetZeroCountOfPrime(int left, int right)
    {
        const int maxZeroCount = 40000;
        int zeroCount = Interlocked.Increment(ref _zeroCount);
        while (zeroCount <= maxZeroCount)
        {
            if (zeroCount % 1000 == 0)
                Console.WriteLine("testing " + left + " 0{" + zeroCount + "} " + right);

            if (IsPrime(left, right, zeroCount))
            {
                Interlocked.Add(ref _zeroCount, maxZeroCount);
                return zeroCount;
            }
            else
                zeroCount = Interlocked.Increment(ref _zeroCount);
        }

        return PrimeNotFound;
    }

    private static bool SkipTemplate(int left, int right)
    {
        for (int leftDiv = 1; leftDiv <= left; leftDiv *= 10)
            for (int rightDiv = 1; rightDiv <= right; rightDiv *= 10)
                if (_templatesToSkip.Contains(Tuple.Create(left / leftDiv, right % (rightDiv * 10))))
                    return true;

        return false;
    }

    private static bool IsPrime(int left, int right, int zeroCount)
    {
        return IsPrime(left.ToString() + new string('0', zeroCount) + right.ToString());
    }

    private static bool IsPrime(string left, string right, int zeroCount)
    {
        return IsPrime(left + new string('0', zeroCount) + right);
    }

    private static bool IsPrime(string s)
    {
        using (mpz_t n = new mpz_t(s))
        {
            return n.IsProbablyPrimeRabinMiller(20);
        }
    }

    private static bool IsFragile(int left, int right, int zeroCount)
    {
        string leftStr = left.ToString();
        string rightStr = right.ToString();

        for (int startIndex = 0; startIndex < leftStr.Length - 1; startIndex++)
            for (int count = 1; count < leftStr.Length - startIndex; count++)
                if (IsPrime(leftStr.Remove(startIndex, count), rightStr, zeroCount))
                    return false;

        for (int startIndex = 1; startIndex < rightStr.Length; startIndex++)
            for (int count = 1; count <= rightStr.Length - startIndex; count++)
                if (IsPrime(leftStr, rightStr.Remove(startIndex, count), zeroCount))
                    return false;

        return true;
    }

    private static IEnumerable<Tuple<int, int>> GetTemplates()
    {
        const int maxDigitCount = 8;
        PreparePrimeSieve((int)BigInteger.Pow(10, maxDigitCount));
        for (int digitCount = 2; digitCount <= maxDigitCount; digitCount++)
        {
            for (int leftCount = 1; leftCount < digitCount; leftCount++)
            {
                int rightCount = digitCount - leftCount;
                int maxLeft = (int)BigInteger.Pow(10, leftCount);
                int maxRight = (int)BigInteger.Pow(10, rightCount);

                for (int left = maxLeft / 10; left < maxLeft; left++)
                    for (int right = maxRight / 10; right < maxRight; right++)
                        if (IsValidTemplate(left, right, leftCount, rightCount))
                            yield return Tuple.Create(left, right);
            }

        }
    }

    private static void PreparePrimeSieve(int limit)
    {
        _primeSieve = new BitArray(limit + 1, true);
        _primeSieve[0] = false;
        _primeSieve[1] = false;

        for (int i = 2; i * i <= limit; i++)
            if (_primeSieve[i])
                for (int j = i * i; j <= limit; j += i)
                    _primeSieve[j] = false;
    }

    private static bool IsValidTemplate(int left, int right, int leftCount, int rightCount)
    {
        int rightDigit = right % 10;
        if ((rightDigit != 1) && (rightDigit != 9))
            return false;

        if (left % 10 == 0)
            return false;

        if ((left + right) % 3 == 0)
            return false;

        if (!Coprime(left, right))
            return false;

        int leftDiv = 1;
        for (int i = 0; i <= leftCount; i++)
        {
            int rightDiv = 1;
            for (int j = 0; j <= rightCount; j++)
            {
                int combination = left / leftDiv * rightDiv + right % rightDiv;
                if (_primeSieve[combination])
                    return false;

                rightDiv *= 10;
            }

            leftDiv *= 10;
        }

        return true;
    }

    private static bool Coprime(int a, int b)
    {
        while (b != 0)
        {
            int t = b;
            b = a % b;
            a = t;
        }
        return a == 1;
    }
}

पुराना उत्तर:

8 0{5436} 4 0{4600} 1

नाजुक अपराधों के लिए कुछ उल्लेखनीय पैटर्न हैं:

600..00X00..009
900..00X00..009
800..00X00..001
999..99X99..999

जहाँ X 1, 2, 4, 5, 7 या 8 हो सकता है।

ऐसी संख्याओं के लिए हमें केवल (लंबाई - 1) संभावित Removeसंचालन पर विचार करना होगा। अन्यRemove ऑपरेशन या तो डुप्लिकेट या स्पष्ट रूप से मिश्रित संख्या का उत्पादन करते हैं। मैंने 800 अंकों तक ऐसे सभी नंबरों की खोज करने की कोशिश की और देखा कि 4 पैटर्न बाकी हिस्सों की तुलना में अधिक बार आते हैं: 8007001, 8004001, 9997999 और 6004009। चूंकि एमिल और जकुब 999X999 पैटर्न का उपयोग कर रहे हैं, मैंने 8004001 का उपयोग करने का फैसला किया कुछ किस्म जोड़ने के लिए।

मैंने एल्गोरिथ्म में निम्नलिखित अनुकूलन जोड़े हैं:

  • मैं 7000 अंकों के साथ संख्याओं की खोज करना शुरू करता हूं और फिर हर बार 1500 की वृद्धि की लंबाई के साथ एक नाजुक प्राइम पाया जाता है। यदि दी गई लंबाई के साथ कोई नाजुक प्राइम नहीं है, तो मैं इसे १.ment०० से बढ़ाता हूं और १५०० सिर्फ मनमानी संख्याएं हैं जो उचित लगती थीं।
  • मैं एक ही समय में विभिन्न लंबाई के साथ संख्याओं की खोज के लिए मल्टीथ्रेडिंग का उपयोग कर रहा हूं।
  • डुप्लिकेट चेक को रोकने के लिए प्रत्येक प्राइम चेक का परिणाम हैश तालिका में संग्रहीत किया जाता है।
  • मैं Mpir.NET से मिलर-राबिन कार्यान्वयन का उपयोग कर रहा हूं , जो बहुत तेज है (एमपीआईआर जीएमपी का एक कांटा है)।
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using Mpir.NET;

class Program
{
    const string _template = "8041";

    private static ConcurrentDictionary<Tuple<int, int>, byte> _compositeNumbers = new ConcurrentDictionary<Tuple<int, int>, byte>();
    private static ConcurrentDictionary<int, int> _leftPrimes = new ConcurrentDictionary<int, int>();
    private static ConcurrentDictionary<int, int> _rightPrimes = new ConcurrentDictionary<int, int>();

    static void Main(string[] args)
    {
        int threadCount = Environment.ProcessorCount;
        Task[] tasks = new Task[threadCount];
        for (int i = 0; i < threadCount; i++)
        {
            int index = i;
            tasks[index] = Task.Run(() => SearchFragilePrimes());
        }
        Task.WaitAll(tasks);
    }

    private const int _lengthIncrement = 1500;
    private static int _length = 7000;
    private static object _lengthLock = new object();
    private static object _consoleLock = new object();

    private static void SearchFragilePrimes()
    {
        int length;
        lock (_lengthLock)
        {
            _length++;
            length = _length;
        }

        while (true)
        {
            lock (_consoleLock)
            {
                Console.WriteLine("{0:T}: length = {1}", DateTime.Now, length);
            }

            bool found = false;
            for (int rightCount = 1; rightCount <= length - 2; rightCount++)
            {
                int leftCount = length - rightCount - 1;
                if (IsFragilePrime(leftCount, rightCount))
                {
                    lock (_consoleLock)
                    {
                        Console.WriteLine("{0:T}: {1} {2}{{{3}}} {4} {2}{{{5}}} {6}",
                            DateTime.Now, _template[0], _template[1], leftCount - 1,
                            _template[2], rightCount - 1, _template[3]);
                    }
                    found = true;
                    break;
                }
            }

            lock (_lengthLock)
            {
                if (found && (_length < length + _lengthIncrement / 2))
                    _length += _lengthIncrement;
                else
                    _length++;
                length = _length;
            }
        }
    }

    private static bool IsFragilePrime(int leftCount, int rightCount)
    {
        int count;
        if (_leftPrimes.TryGetValue(leftCount, out count))
            if (count < rightCount)
                return false;

        if (_rightPrimes.TryGetValue(rightCount, out count))
            if (count < leftCount)
                return false;

        if (!IsPrime(leftCount, rightCount))
            return false;

        for (int i = 0; i < leftCount; i++)
            if (IsPrime(i, rightCount))
                return false;

        for (int i = 0; i < rightCount; i++)
            if (IsPrime(leftCount, i))
                return false;

        return true;
    }

    private static bool IsPrime(int leftCount, int rightCount)
    {
        Tuple<int, int> tuple = Tuple.Create(leftCount, rightCount);
        if (_compositeNumbers.ContainsKey(tuple))
            return false;

        using (mpz_t n = new mpz_t(BuildStr(leftCount, rightCount)))
        {
            bool result = n.IsProbablyPrimeRabinMiller(20);

            if (result)
            {
                _leftPrimes.TryAdd(leftCount, rightCount);
                _rightPrimes.TryAdd(rightCount, leftCount);
            }
            else
                _compositeNumbers.TryAdd(tuple, 0);

            return result;
        }
    }

    private static string BuildStr(int leftCount, int rightCount)
    {
        char[] chars = new char[leftCount + rightCount + 1];
        for (int i = 0; i < chars.Length; i++)
            chars[i] = _template[1];
        chars[0] = _template[0];
        chars[leftCount + rightCount] = _template[3];
        chars[leftCount] = _template[2];
        return new string(chars);
    }
}

जब मैं आपके पहले उत्तर को सत्यापित करने की कोशिश कर रहा था, तो आप पहले ही एक नई पोस्ट कर चुके हैं))। चेकिंग में पहले ही 24 घंटे लग गए। उत्तर सही प्रतीत होता है। मुझे विश्वास नहीं हो रहा है कि जावा का बिगइन्टियर देशी कार्यान्वयन की तुलना में बहुत धीमा है। मैंने 2, 3 या 10 बार के बारे में सोचा। लेकिन कई मिनटों के मुकाबले 24 घंटे बहुत ज्यादा हैं।
क्वालाटैग

@Qualtagh निष्पक्ष होने के लिए, 1008 अंकों की संख्या को हीन एल्गोरिथ्म के कारण खोजने में 35 घंटे लगते हैं :) मेरा वर्तमान कार्यक्रम आपके 6629 अंकों की संख्या को खोजने में लगभग 3 मिनट और 28164 अंकों वाले को खोजने में 6 घंटे का समय लेता है।
उप

आपका पहला उत्तर सही है। सत्यापित! सत्यापन में 48 घंटे लगे। और मैं दूसरे उत्तर को सत्यापित करने की कोशिश भी नहीं करूंगा))। मैं सोच रहा हूं कि बिगइंटर क्यों MPIR की तुलना में धीमी है। क्या यह केवल जेवीएम / मूल अंतर है? मैंने "-सर्वर" ध्वज सेट किया है, इसलिए कोड को JIT- संकलित करने की अपेक्षा करें। मॉड्यूलर घातांक के एल्गोरिदम भिन्न होते हैं: जावा और एमपीआईआर दोनों 2 <सुप> के </ सुप> -री स्लाइडिंग विंडो का उपयोग करते हैं, लेकिन k = 3 जावा में तय किया गया है और एमपीआईआर घातांक के आकार के अनुसार कश्मीर चुनता है। क्या MPIR कई कोर या शायद GPU क्षमताओं पर समानांतर संगणना का उपयोग कर रहा है? Java का BigInteger नहीं है।
क्वालटैग

1
@Qualtagh मुझे पूरा यकीन है कि MPIR केवल एक CPU कोर का उपयोग कर रहा है। मैंने खुद को मल्टीथ्रेडिंग जोड़ लिया है जिसके परिणामस्वरूप क्वाड-कोर सीपीयू पर लगभग 4 गुना तेजी से खोज हुई है। मैंने MPIR और Java BigInteger के आंतरिक कार्यान्वयन की तुलना नहीं की है, लेकिन मुझे लगता है कि MPIR गुणा और मॉड्यूलर विभाजन के लिए बेहतर एल्गोरिदम का उपयोग कर रहा है। साथ ही, यह 64-बिट सीपीयू के लिए बेहतर अनुकूलित है ( इस ब्लॉग पोस्ट में बेंचमार्क देखें )।
सबोप्टिमस प्राइम

2
MPIR वास्तव में सिंगल कोर है और यह GPU का उपयोग नहीं करता है। यह C और कोडांतरक कोड का एक अत्यधिक अनुकूलित और बढ़िया ट्यून्ड मिक्स है। एक MPIR संस्करण है जो केवल C (पोर्टेबिलिटी कारणों के लिए) का उपयोग करता है, लेकिन C + ASM संस्करण विशेष रूप से तेज है। MPIR.Net का उपयोग कर रहा MPIR.Net C8 (1st gen x64) इंस्ट्रक्शन सेट का उपयोग करते हुए C + ASM है, क्योंकि मैं चाहता था कि MPIR.Net सभी x64 PC पर चले। बाद के निर्देश सेट के संस्करण मेरे क्रिप्टो बेंचमार्क में अधिक तेज़ नहीं थे, लेकिन यह निश्चित रूप से अन्य कार्यों के लिए भिन्न हो सकते हैं।
जॉन रेनॉल्ड्स

2

हास्केल - 1220 1277 अंक वास्तव में वास्तविक के लिए तय किए गए हैं

99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997999999999999999999999999999999999999999999999999999999999999999999999

9{1150} 7 9{69}

बेहतर एक - 1277 अंक

9{871} 8 9{405}

हास्केल कोड

downADigit :: Integer -> [Integer]
downADigit n = f [] 1 where
     f xs a | nma /= n = f (((n `div` a10)*a + nma):xs) a10
            | otherwise = xs where
        a10 = a * 10
        nma = n `mod` a

isFragile = all (not . isPrime') . downADigit
findNextPrime :: Integer -> Integer
findNextPrime n | even n = f (n + 1)
                | otherwise = f n where
    f n | isPrime' n  = n
        | otherwise = f (n + 2)

primesFrom n = f (findNextPrime n) where
    f n = n:f (findNextPrime $ n + 1)

primeLimit = 10000

isPrime' n | n < primeLimit = isPrime n
isPrime' n = all (millerRabinPrimality n) [2,3,5,7,11,13,17,19,984,7283,6628,8398,2983,9849,2739]

-- (eq. to) find2km (2^k * n) = (k,n)
find2km :: Integer -> (Integer,Integer)
find2km n = f 0 n
    where 
        f k m
            | r == 1 = (k,m)
            | otherwise = f (k+1) q
            where (q,r) = quotRem m 2        

-- n is the number to test; a is the (presumably randomly chosen) witness
millerRabinPrimality :: Integer -> Integer -> Bool
millerRabinPrimality n a
    | a <= 1 || a >= n-1 = 
        error $ "millerRabinPrimality: a out of range (" 
              ++ show a ++ " for "++ show n ++ ")" 
    | n < 2 = False
    | even n = False
    | b0 == 1 || b0 == n' = True
    | otherwise = iter (tail b)
    where
        n' = n-1
        (k,m) = find2km n'
        b0 = powMod n a m
        b = take (fromIntegral k) $ iterate (squareMod n) b0
        iter [] = False
        iter (x:xs)
            | x == 1 = False
            | x == n' = True
            | otherwise = iter xs

-- (eq. to) pow' (*) (^2) n k = n^k
pow' :: (Num a, Integral b) => (a->a->a) -> (a->a) -> a -> b -> a
pow' _ _ _ 0 = 1
pow' mul sq x' n' = f x' n' 1
    where 
        f x n y
            | n == 1 = x `mul` y
            | r == 0 = f x2 q y
            | otherwise = f x2 q (x `mul` y)
            where
                (q,r) = quotRem n 2
                x2 = sq x

mulMod :: Integral a => a -> a -> a -> a
mulMod a b c = (b * c) `mod` a
squareMod :: Integral a => a -> a -> a
squareMod a b = (b * b) `rem` a

-- (eq. to) powMod m n k = n^k `mod` m
powMod :: Integral a => a -> a -> a -> a
powMod m = pow' (mulMod m) (squareMod m)

-- simple for small primes
primes :: [Integer]
primes = 2:3:primes' where
    1:p:candidates = [6*k+r | k <- [0..], r <- [1,5]]
    primes'        = p : filter isPrime candidates
    isPrime n      = all (not . divides n)
                                   $ takeWhile (\p -> p*p <= n) primes'
    divides n p    = n `mod` p == 0
isPrime :: Integer -> Bool
isPrime n | n < 2 = False
          | otherwise = f primes where
            f (p:ps) | p*p <= n = if n `rem` p == 0 then False else f ps
                     | otherwise = True

main = do
    print . head $ filter isFragile (primesFrom $ 10^1000)

मुझे लगता है कि आप अंतिम 3 को छोड़कर सब कुछ हटा सकते हैं ...
Sp3000

यह 5 में समाप्त होता है अगर मैं अंतिम 3 को हटा देता हूं तो 5 से
अदृश्य होता है

2
नहीं, मेरा मतलब है कि जब तक आपके पास अंतिम 3 बायीं ओर सब कुछ नहीं है, जो कि प्रमुख है।
Sp3000

1
@JohnMeacham मेरा कार्यक्रम बताता है कि यदि आप बाईं ओर से 386 अंक निकालते हैं तो यह संख्या प्राइम में बदल जाती है।
सबप्टिमस प्राइम

1
कृपया, पोस्ट करने से पहले अपने नंबर को सत्यापित करें। यदि आप अपने 1276-अंकीय संख्या से बाएँ 1256 अंक निकालते हैं, तो आपको 99999994999999999999 मिलेगा, जो कि अभाज्य है।
सबोप्टिमस प्राइम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.