বৃহত্তম ভঙ্গুর প্রাইম সন্ধান করুন


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

প্রতিটি সম্ভাব্য Removeক্রিয়াকলাপটিকে অ-প্রধান করে তুললে আমরা প্রাইম নম্বর এক্সকে ভঙ্গুর বলব। উদাহরণস্বরূপ, 80651 একটি ভঙ্গুর প্রাইম, কারণ নিম্নলিখিত সমস্ত সংখ্যার প্রধান নয়:

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

লক্ষ্য

এমন একটি প্রোগ্রাম লিখুন যা সবচেয়ে বড় ভঙ্গুর প্রাইম খুঁজে পায়। সম্পাদনা করুন: সময় সীমাটি সরিয়ে ফেলেছে কারণ এটির বিপর্যয়ের তুলনামূলকভাবে সুষ্ঠু উপায় ছিল।

স্কোরটি হ'ল আপনার প্রোগ্রামের দ্বারা পাওয়া ভঙ্গুর প্রধান সংখ্যা। টাই হওয়ার সময়ে পূর্বের জমাটি জয়ী হয়।

বিধি

  • আপনি যে কোনও ভাষা এবং কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করতে পারেন।
  • আপনি নিজের হার্ডওয়্যারটিতে প্রোগ্রামটি চালান।
  • আপনি সম্ভাব্য প্রাথমিক পরীক্ষা ব্যবহার করতে পারেন।
  • সবকিছু বেস 10 এ রয়েছে।

নেতৃস্থানীয় এন্ট্রি

  • কোয়ালটাগ (জাভা) দ্বারা 6629 সংখ্যা
  • এমিল দ্বারা 5048 সংখ্যা (পাইথন 2)
  • জাকুবে 2250 অঙ্ক (পাইথন 2)

সম্পাদনা: আমি আমার নিজের উত্তর যুক্ত করেছি।

  • কোয়ালটাগের অ্যালগোরিদম (সি #) এর উপর ভিত্তি করে সাবোটিমাস প্রাইম দ্বারা 28164 সংখ্যা

5
এমনকি যদি আমি উত্তরটির কোডটি হার্ড নাও করি তবে আমি একটি বৃহত ভঙ্গুর প্রাইমের খুব কাছাকাছি সময়ে অনুসন্ধান শুরু করতে পারি । স্পষ্টতই, কেউ 1 এ অনুসন্ধান শুরু করতে চায় না আমাকে এই কাজটি করতে বাধা দিচ্ছে কি? মূলত উত্তরটি হার্ড-কোডিংয়ের জন্য ডাকা হওয়ার আগে আমি ঠিক কীভাবে আমার সন্ধান শুরু করতে পারি? আমি চ্যালেঞ্জটি ভালোবাসি।
রেইনবোল্ট

2
@ সুবপটিমাসপ্রাইম পরিবর্তে আপনি সময় সীমা পুরোপুরি সরিয়ে ফেলতে পারেন, কারণ আমি বিশ্বাস করি যে এক পর্যায়ে এমন বিরল হবে যে যাইহোক পরেরটি খুঁজে পাওয়ার এটি একটি কীর্তি হয়ে থাকবে। ( কোডগল্ফ.স্ট্যাকেক্সেঞ্জাওয়েশন এর অনুরূপ / প্রশ্নগুলি / ৪১০১১/২ )
মার্টিন এন্ডার


7
যাদের ধীর কম্পিউটার রয়েছে তাদের আপনি এখনও অসুবিধে করে
জন ডিভোরাক

11
এটি বুঝতে আমার একটি বিব্রতকরভাবে দীর্ঘ সময় লেগেছিল যে "এমন একটি প্রোগ্রাম লিখুন যা সবচেয়ে বড় ভঙ্গুর প্রধান খুঁজে পায়" এর অর্থ এই নয় যে "এখানে একটি বৃহত্তম ভঙ্গুর প্রাইম রয়েছে। একটি প্রোগ্রাম লিখুন যা এটি খুঁজে পায়" " আমার ধারণা আমি খুব বেশি প্রোজেক্ট অলারের কাজ করেছি। :
পি

উত্তর:


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      ...

আর এবং এর সমস্ত শেষ সংমিশ্রিত হলে আর ডান সংখ্যার ডান সংমিশ্রকে কল করুন।

আমরা প্রস্থ-প্রথম পদ্ধতিতে সমস্ত সংমিশ্রণ সংখ্যার উপরে পুনরাবৃত্তি করব: 1, 9, 01, 81, 91, 09, 49, 69, 99, 001, 801, 901 ইত্যাদি

শূন্য দিয়ে শুরু হওয়া সংখ্যাগুলি প্রাথমিকতার জন্য পরীক্ষা করা হয় না তবে আরও সংখ্যা তৈরি করার প্রয়োজন হয়।

আমরা X00 ... 00R আকারে একটি লক্ষ্য সংখ্যাটি অনুসন্ধান করব, যেখানে এক্স 4, 6, 8 বা 9 এর মধ্যে আর আর সঠিক সংমিশ্রণ। এক্স প্রাইম হতে পারে না। এক্স 0 হতে পারে না এবং এক্স 1 হতে পারে না কারণ আর যদি 1 বা 9 দিয়ে শেষ হয় তবে N এর মধ্যে 11 বা 19 থাকতে পারে।

এক্সারটিতে "অপসারণ" অপারেশনের পরে যদি প্রধান সংখ্যা থাকে তবে এক্সওয়াইআর এগুলিকে যে কোনও ওয়াইয়ের জন্য খুব বেশি রাখে So সুতরাং আমাদের আর থেকে শুরু করে শাখাগুলি ট্র্যাভার করা উচিত নয় should

এক্স একটি ধ্রুবক হতে দিন, 6 বলুন।

pseudocode:

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 ).
        }
      }
    }
  }
}

আমাদের জিরোসের পরিমাণ সীমাবদ্ধ করা উচিত কারণ এক্স + জিরোস + আর (বা তাদের সবগুলি সংমিশ্রিত হয়ে থাকলে চিরতরে) ফর্মের প্রাথমিক সংখ্যা খুঁজে পেতে খুব বেশি সময় লাগতে পারে।

আসল কোডটি বেশ ভার্জোজ এবং এখানে পাওয়া যাবে

দীর্ঘ ইনট রেঞ্জের সংখ্যার জন্য প্রাথমিকতার পরীক্ষা মিলার পরীক্ষার ডিটারমিনিস্টিক বৈকল্পিক দ্বারা সঞ্চালিত হয়। বিগইন্টেজার সংখ্যার জন্য প্রথমে একটি পরীক্ষা বিভাগ করা হয় এবং তারপরে বেলিপিএসডাব্লু পরীক্ষা হয়। এটি সম্ভাব্য তবে যথেষ্ট নিশ্চিত। এবং এটি মিলার-রবিন পরীক্ষার চেয়ে দ্রুত (মিলার-রাবিনে এত বড় সংখ্যার যথাযথ নির্ভুলতা অর্জনের জন্য আমাদের অনেকগুলি পুনরাবৃত্তি করা উচিত)।

সম্পাদনা: প্রথম প্রচেষ্টাটি ভুল ছিল। এক্স 0 ... 0 আর যদি প্রধান হয় তবে আমাদের আর দিয়ে শুরু করা শাখাগুলিও উপেক্ষা করা উচিত। তাহলে এক্স 0 ... 0YR ভঙ্গুর প্রাইম হবে না। সুতরাং একটি অতিরিক্ত চেক যোগ করা হয়েছিল। এই সমাধানটি সঠিক বলে মনে হচ্ছে।

সম্পাদনা 2: একটি অপ্টিমাইজেশন যুক্ত করেছে। যদি (এক্স + আর) 3 দ্বারা বিভাজ্য হয় তবে (এক্স + জিরোস + আর) 3 দ্বারা বিভাজ্যও তাই (এক্স + জিরোস + আর) এই ক্ষেত্রে প্রধান হতে পারে না এবং এই জাতীয় আর এড়িয়ে যেতে পারে।

3 সম্পাদনা করুন: প্রাইম ডিজিটগুলি শেষ বা প্রথম অবস্থানে না থাকলে এড়িয়ে যাওয়া দরকার ছিল না। 21 বা 51 এর মতো শেষগুলি ঠিক আছে। কিন্তু এটি খুব বেশি কিছু পরিবর্তন করে না।

উপসংহার:

  1. আমার শেষ উত্তরটি 100 মিনিটের জন্য ভঙ্গুর হওয়ার জন্য পরীক্ষা করছিল। উত্তরের সন্ধান (পূর্ববর্তী সমস্ত রূপগুলি পরীক্ষা করা) প্রায় 15 মিনিট সময় নেয়। হ্যাঁ, অনুসন্ধানের সময় সীমাবদ্ধ করার কোনও অর্থ নেই (আমরা লক্ষ্য নম্বর থেকে অনুসন্ধান শুরু করতে পারি, তাই সময়টি শূন্য হবে)। তবে এই প্রশ্নের মতো পরীক্ষার সময়কে সীমাবদ্ধ করা অর্থবহ হতে পারে ।
  2. উত্তর 60 ... 049099 মাঝখানে 4 সংখ্যা রয়েছে। যদি "অপসারণ" অপারেশনটি এটি স্পর্শ করে, সংখ্যাটি 3 দ্বারা বিভাজ্য হয়ে যায় তাই আমাদের বাম এবং ডানদিকে অপসারণ অপারেশনগুলি পরীক্ষা করা উচিত। ডান দিকটি খুব ছোট। বাম পাশের দৈর্ঘ্য প্রায় n = দৈর্ঘ্য (এন)।
  3. বিপিএসডাব্লু এবং মিলার-রবিনের মতো আদিমতার পরীক্ষাগুলি ধ্রুব পরিমাণে মডুলার এক্সপেনসিয়েশন ব্যবহার করে। এই পৃষ্ঠাটি অনুসারে এর জটিলতা হ'ল (এম (এন) * এন) , যেখানে এম (এন) গুণক জটিলতা। জাভা টুম-কুক এবং করাতসুবা অ্যালগরিদম ব্যবহার করে তবে আমরা সরলতার জন্য স্কলার আলগোরিদম গ্রহণ করব take এম (এন) = এন 2 । সুতরাং প্রাথমিকতা পরীক্ষার জটিলতা হ'ল হে (এন 3 )।
  4. আমাদের দৈর্ঘ্য = 6 থেকে 6629 পর্যন্ত সমস্ত সংখ্যা যাচাই করা উচিত Let's আসুন সাধারণতার জন্য ন্যূনতম = 1 এবং সর্বোচ্চ = এন নেওয়া উচিত take পুরো চেক জটিলতা হ'ল ও (1 3 + 2 3 + ... + n 3 ) = ও ((এন * (এন + 1) / 2) 2 ) = ও (এন 4 )।
  5. এমিলের উত্তরে একই চেকিং অ্যাসিম্পটোটিকস রয়েছে। তবে ধ্রুবক ফ্যাক্টর কম হয়। সংখ্যার মাঝে অঙ্ক "7" দাঁড়িয়ে আছে। বাম দিক এবং ডান দিক প্রায় সমান হতে পারে। এটি দেয় (n / 2) 4 * 2 = n 4 / 8. স্পিডআপ: 8 এক্স। 9 ... 9Y9 ... 9 ফর্মের নম্বরগুলি X0 ফর্মের চেয়ে 1.7 গুণ বেশি দীর্ঘ হতে পারে ... 0R একই পরীক্ষার সময় রয়েছে।

1
কৃতিত্বের জন্য ধন্যবাদ, তবে আপনার অ্যালগরিদম আমার চেয়ে অনেক বেশি জটিল! দুর্দান্ত কাজ, এবং পিপিসিজিতে আপনাকে স্বাগতম! :)
FryAmTheEggman

@ ফ্রাইআম দ্য এজিগম্যান: ধারণার জন্য আপনাকে ধন্যবাদ! এটা অনুপ্রেরণাজনক।
কোয়ালটাগ

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

13

পাইথন 2 - 126 1221 1337 1719 2268 ডিজিট

999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999799999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

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

সরানোর (এন, স্টার্টইন্ডেক্স, গণনা) এর প্রায় লেন (এন) ^ 2 ফলাফলের সংখ্যা রয়েছে। আমি এই সংখ্যাগুলি হ্রাস করার চেষ্টা করেছি। যদি একে অপরের পাশে প্রচুর অঙ্ক একই থাকে তবে এর ফলে প্রাপ্ত সংখ্যক সংখ্যাটি এড়ানো যায় কারণ তারা একাধিকবার প্রদর্শিত হয়।

সুতরাং আমি এটিকে চরম দিকে নিয়ে গেলাম, কেবলমাত্র 9s এবং মাঝখানে কিছুটা প্রাথমিক। আমি 1 মিলিয়নের অধীনে ভঙ্গুর প্রাইমটি একবার দেখেছিলাম এবং দেখেছি যে এরকম ভঙ্গুর প্রাইম রয়েছে। শেষে 2 9s সহ সংখ্যাগুলি অনুসন্ধান করা সত্যিই ভাল কাজ করে কেন তা নিশ্চিত নয় works 1 নম্বর, 3, বা 4 9s এর শেষে ছোট ভঙ্গুর প্রাইমের ফলাফল।

এটি পাইপরিমস মডিউলটি ব্যবহার করে । আমি নিশ্চিত নই, যদি এটি কোনও ভাল হয়। এটি মিলার_আরবিন পরীক্ষা ব্যবহার করে, তাই এটি সম্ভাব্য।

প্রোগ্রামটি প্রায় 12 মিনিটের মধ্যে এই 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 9 এস অনুসন্ধান করেছি। সুবিধাটি হ'ল, যদি আপনি y ঠিক করে থাকেন তবে আপনাকে প্রাথমিক (ও) সংখ্যা পরীক্ষা করতে হবে। এটি বরং 1221 সন্ধান করে।

3 সম্পাদনা করুন:

2268 ডিজিটের সংখ্যার জন্য আমি একই প্রোগ্রামটি ব্যবহার করি, কেবল একাধিক কোরগুলিতে কাজটি বিভক্ত করেছি।


3
"প্রায় 1 মিনিটের মধ্যে" - দুঃখিত, একটি বহুবচন "বাগ" প্রতিবেদন করতে হবে। : পি
hichris123

মিলার-রাবিনের সম্ভাব্য প্রকৃতিটিই আমার শেষ কয়েকটি প্রবেশের জন্য আমাকে কামড় দিচ্ছিল। আপনি অন্য একটি অ্যালগরিদমের সাথেও যাচাই করতে চাইতে পারেন।
জন মিচাম

আপনি কেবল কেন পরীক্ষা করে দেখেন যে শেষ থেকে অঙ্কগুলি সরাতে গঠিত সংখ্যাগুলি যৌগিক? সামনে থেকে অঙ্কগুলি মুছে দিয়ে গঠিত সংখ্যাগুলি কেন পরীক্ষা করবেন না?
isaacg

1
কারণ আমি 'ল-আই-লুপ' এর আগে এগুলি পরীক্ষা করেছিলাম। এখানে আমি শুরুতে 9 টি সংযোজন করেছি এবং একটি প্রাথমিক চেক করব। আমি যখন এই ফর্মটির প্রথম প্রাথমিক সংখ্যাটি পাই, আমি জানি, শুরুতে কম 9s সহ সমস্ত সংখ্যা প্রধান নয়। এবং শেষে 9 টি অপসারণের জন্য চেক করার পরে, আমি থামিয়েছি (বিরতি), কারণ এখন, প্রতিটি সংখ্যার একটি প্রাথমিক সংখ্যা থাকে এবং তাই এটি প্রধান নয়।
জাকুবে

আহ, খুব চতুর।
isaacg

7

পাইথন 2.7 - 429623069 99993799

এখন পর্যন্ত কোনও অপ্টিমাইজেশন নেই। ভঙ্গুর প্রাইমস সম্পর্কে কিছু তুচ্ছ পর্যবেক্ষণ ব্যবহার করে (আড্ডায় রেইনবোল্টকে ধন্যবাদ):

  1. ভঙ্গুর প্রাইমস অবশ্যই 1 বা 9 এ শেষ হতে হবে (পুরষ্কার এমনকি নয়, এবং চূড়ান্ত অঙ্কটি প্রাইম হওয়া উচিত নয়)
  2. 1 এ শেষ হওয়া নাজুক প্রাইমগুলি 8 বা 9 দিয়ে শুরু করা উচিত (প্রথম সংখ্যাটি প্রাইম হতে পারে না, এবং 11, 41 এবং 61 এবং সমস্ত প্রাইম হয়)
  3. 9 এ শেষ হওয়া নাজুক প্রাইমগুলি অবশ্যই 4,6 বা 9 দিয়ে শুরু করা উচিত (1 এর যুক্তি দেখুন, তবে কেবল 89 টি প্রাথমিক)

শুধু বলটি ঘূর্ণায়মান করার চেষ্টা করছি :)

এই প্রযুক্তিগতভাবে 15 মিনিটেরও বেশি চালিত হয় তবে এটি অতিরিক্ত সময়ে কেবলমাত্র একটি একক সংখ্যা পরীক্ষা করে।

is_primeএখান থেকে নেওয়া হয়েছে (আইস্যাক এটি এখানে ব্যবহার করেছেন ) এবং এটি সম্ভাব্য prob

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 পদ্ধতিটি দ্রুত কাজ করতে পারে যদি আপনি সম্পূর্ণ পরীক্ষার বিভাগের অংশটি মন্তব্য করেন।
Suboptimus Prime

সুবুটিমাস প্রাইম ওহ, ধন্যবাদ আমি এটির
দিকেও তাকাইনি

@ সুবপটিমাসপ্রাইম আমি মনে করি সম্পূর্ণ মূল্য নির্ধারণকারী চেকটি ছোট মূল্যবোধের জন্য দ্রুত কারণ লেখক প্রার্থী উপাদানগুলির মধ্যে পদক্ষেপ গ্রহণের পদক্ষেপগুলি সংজ্ঞায়িত করেছেন। আইডিয়াটির জন্য আবার ধন্যবাদ, তবে এটিকে ছেড়ে যাওয়ার সময় অনেক দ্রুত মনে হচ্ছে :)
FryAmTheEggman

আপনার উত্তরের ছোট সংশোধন: 91 = 13x7, সুতরাং 91 টি যৌগিক, এবং 1 এ শেষ হওয়া ভঙ্গুর প্রাইমগুলি আসলে 9 দিয়ে শুরু হতে পারে
সাবপটিমাস প্রাইম

@ সুবপিটিমাস প্রাইম বেশ ঠিক আছে, কীভাবে আমি এলোমেলো করে ফেলেছি তা না। আমি পোস্ট করা মানটি এখনও বৈধ হওয়া উচিত, কারণ আমি কেবল কিছু সম্ভাব্য মানগুলি এড়িয়ে চলেছিলাম।
FryAmTheEggman

7

পাইথন 2, 828 সংখ্যা 5048 অঙ্ক

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

@ যাকুব যেমন উল্লেখ করেছেন, আমার কোডটিতে ত্রুটির কারণে আমি যে প্রথম প্রধানমন্ত্রীটি জমা দিয়েছিলাম তা আসলে নাজুক ছিল না। বাগ ঠিক করা সহজ ছিল তবে এটি অ্যালগরিদমকে উল্লেখযোগ্যভাবে ধীর করে তুলল।

আমি নিজেকে ভঙ্গুর প্রাইমগুলির একটি সহজে অনুসন্ধানযোগ্য উপসেটের মধ্যে সীমাবদ্ধ করে রেখেছি, যাহারা কেবলমাত্র 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))

আমি একই ব্যবহৃত is_prime(থেকে ফাংশন এখানে ) @FryAmTheEggman হিসাবে।

সম্পাদনা:

অ্যালগোরিদম দ্রুত করতে আমি দুটি পরিবর্তন করেছি:

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

  • ফর্মের সংখ্যার জন্য b*'9' + '7' + c*'9'আমি আকারটি সীমাবদ্ধ করে রেখেছি b। সীমাটি যত কম হবে, কম সংখ্যাও পরীক্ষা করতে হবে, তবে কোনও বড় ভঙ্গুর প্রাইমকে খুঁজে না পাওয়ার সম্ভাবনা বাড়ছে। আমি ধরণের ইচ্ছামত সীমা হিসাবে 222 বেছে নিয়েছি।

কয়েক হাজার অঙ্কে একটি একক প্রাথমিক চেক ইতিমধ্যে আমার প্রোগ্রামটি কয়েক সেকেন্ড নিতে পারে take সুতরাং, আমি সম্ভবত এই পদ্ধতির সাথে আরও ভাল কিছু করতে পারি না।

আমার জমা দেওয়ার নির্ভুলতা পরীক্ষা করে নির্দ্বিধায় দয়া করে। সম্ভাব্যতা বৃদ্ধির কারণে আমার সংখ্যা তাত্ত্বিকভাবে প্রাথমিক হতে পারে না, তবে এটি যদি হয় তবে এটি ভঙ্গুর হতে হবে। অথবা আমি কিছু ভুল করেছি। :-)


2
আপনার পাওয়া প্রাইম ভঙ্গুর নয়। যদি আপনি সরান (এন, 83,838) কল করেন [প্রথম ৮২ সংখ্যা বাদে সমস্ত কিছু সরিয়ে ফেলুন], আপনি প্রাইম দিয়ে শেষ করবেন।
জাকুবে

1
আহ, ধন্যবাদ @ জাকুবে আমি খুব চালাক হওয়ার চেষ্টা করছিলাম। দেখা যাচ্ছে যে আমি আরও প্রাথমিক চেক এড়িয়ে যাচ্ছি তখন আমার উচিত। আমি এটি ঠিক করতে আমার পথে আছি
এমিল

1
এটি আবার পরীক্ষা করে দেখুন, এখন আপনার ফলাফলগুলি সঠিক।
জাকুবে

আপনার 5048 ডিজিটের নম্বরটি আসলে আমার প্রোগ্রাম অনুসারে একটি ভঙ্গুর প্রধান prime
সাব্পটিমাস প্রাইম

@ সুবপিটিমাস প্রাইম: দুর্দান্ত, পরীক্ষার জন্য ধন্যবাদ!
এমিল

4

সি #, 10039 28164 সংখ্যা

6 0{28157} 169669

সম্পাদনা: আমি কিছু ছোটখাট পরিবর্তন করে কোয়ালটাগের অ্যালগরিদমের উপর ভিত্তি করে অন্য একটি প্রোগ্রাম তৈরি করেছি:

  • আমি L000 ... 000R ফর্মের সংখ্যাগুলি সন্ধান করছি, যেখানে এলটি যৌথ বামে রয়েছে, আর ডান সংমিশ্রণ। আমি বাম সংমিশ্রণ নম্বর এলকে একাধিক অঙ্কের অনুমতি দিয়েছি, যদিও এটি বেশিরভাগ ক্ষেত্রে একটি শৈলীর পরিবর্তন, এবং এটি সম্ভবত অ্যালগরিদমের কার্যকারিতা প্রভাবিত করে না।
  • অনুসন্ধানে গতি বাড়ানোর জন্য আমি মাল্টিথ্রেডিং যুক্ত করেছি।
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

যেখানে এক্স 1, 2, 4, 5, 7 বা 8 হতে পারে।

এই জাতীয় সংখ্যার জন্য আমাদের কেবলমাত্র (দৈর্ঘ্য - 1) সম্ভাব্য Removeঅপারেশনগুলি বিবেচনা করতে হবে । অন্যান্য Removeক্রিয়াকলাপগুলি হ'ল ডুপ্লিকেট বা স্পষ্টত সম্মিলিত সংখ্যা উত্পাদন করে produce আমি 800 টিরও বেশি সংখ্যার সাথে এই জাতীয় সমস্ত সংখ্যার সন্ধান করার চেষ্টা করেছি এবং লক্ষ্য করেছি যে বাকীগুলির চেয়ে 4 টি নিদর্শনগুলি আরও ঘন ঘন আসে: 8007001, 8004001, 9997999 এবং 6004009. এমিল এবং জাকুব যেহেতু 999X999 নিদর্শনটি ব্যবহার করছে, তাই আমি ঠিক 8004001 ব্যবহার করার সিদ্ধান্ত নিয়েছি কিছু বিভিন্ন যোগ করতে।

আমি অ্যালগরিদমে নিম্নলিখিত অপটিমাইজেশন যুক্ত করেছি:

  • আমি 7000 সংখ্যার সাথে সংখ্যাগুলি থেকে অনুসন্ধান শুরু করি এবং তারপরে প্রতিবার একটি ভঙ্গুর প্রাইম পাওয়া গেলে 1500 দ্বারা বৃদ্ধি দৈর্ঘ্য। যদি কোনও প্রদত্ত দৈর্ঘ্যের সাথে কোনও ভঙ্গুর প্রাইম না থাকে তবে আমি এটি 1 দিয়ে বাড়িয়ে দেব 7 7000 এবং 1500 কেবল স্বেচ্ছাসেবী সংখ্যা যা উপযুক্ত বলে মনে হয়।
  • আমি একই সাথে বিভিন্ন দৈর্ঘ্যের সংখ্যার সন্ধান করতে মাল্টিথ্রেডিং ব্যবহার করছি।
  • সদৃশ চেক প্রতিরোধ করতে প্রতিটি প্রধান পরীক্ষার ফলাফল একটি হ্যাশ টেবিলের মধ্যে সংরক্ষণ করা হয়।
  • আমি এমপির.এনইটি থেকে মিলার-রবিন বাস্তবায়ন ব্যবহার করছি , যা খুব দ্রুত (এমপিআইআর জিএমপির একটি কাঁটাচামচ)।
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 ঘন্টা খুব বেশি।
কোয়ালটাগ

@ কোয়ালটাঘটি ন্যায়সঙ্গত হওয়ার জন্য, 10039 সংখ্যার নিকৃষ্টতর অ্যালগরিদমের কারণে সন্ধান করতে 35 ঘন্টা লেগেছিল :) আমার বর্তমান প্রোগ্রামটি আপনার 6629 অঙ্কের সংখ্যাটি পেতে 3 মিনিট সময় নেয় এবং 28164 সংখ্যার একটি খুঁজে পেতে 6 ঘন্টা সময় নেয়।
সাব্পটিমাস প্রাইম

আপনার প্রথম উত্তরটি সঠিক। যাচাই! যাচাইকরণে 48 ঘন্টা সময় লেগেছে। এবং আমি দ্বিতীয় উত্তরটি যাচাই করার চেষ্টাও করব না))। আমি ভাবছি কেন বিপিআইন্টেগার এমপিআইআরের সাথে তুলনা করে এত ধীর। এটি কি কেবল জেভিএম / নেটিভ পার্থক্য? আমি একটি "-সার্ভার" পতাকা সেট করেছি, সুতরাং কোডটি JIT- সংকলিত হবে বলে আশা করি। মডুলার এক্সপেনসিয়েটেশনের অ্যালগোরিদম পৃথক: জাভা এবং এমপিআইআর উভয়ই 2 <sup> কে </sup> ব্যবহার করে - মূল স্লাইডিং উইন্ডো, তবে কে = 3 স্থির করে জাভাতে এবং এমপিআইআর কে কে বেছে নেয় এক্সপোঞ্জেন্টের আকার অনুযায়ী choo এমপিআইআর কি বেশ কয়েকটি কোর বা সম্ভবত জিপিইউ সক্ষমতার উপর সমান্তরাল গণনা ব্যবহার করছে? জাভা এর বিগইন্টেজার না।
কোয়ালটাগ

1
@ কোয়ালতাঘ আমি নিশ্চিত যে এমপিআইআর কেবল একটি সিপিইউ কোর ব্যবহার করছে। আমি নিজে মাল্টিথ্রেডিং যুক্ত করেছি যার ফলস্বরূপ একটি কোয়াড-কোর সিপিইউতে প্রায় 4 গুণ দ্রুত অনুসন্ধান করা হয়েছিল। আমি এমপিআইআর এবং জাভা বিগইন্টিজারের অভ্যন্তরীণ বাস্তবায়ন তুলনা করি নি, তবে আমি অনুমান করি যে এমপিআইআর গুণ এবং মডুলার বিভাগের জন্য আরও ভাল অ্যালগরিদম ব্যবহার করছে। এছাড়াও, এটি সম্ভবত 64-বিট সিপিইউগুলির জন্য ভালতর অনুকূলিতকরণ করা হয়েছে ( এই ব্লগ পোস্টের মাপদণ্ড দেখুন )।
Suboptimus Prime

2
এমপিআইআর প্রকৃতপক্ষে একক কোর এবং এটি জিপিইউ ব্যবহার করে না। এটি সি এবং এসেম্বলারের কোডটির একটি অত্যন্ত অনুকূল এবং সূক্ষ্ম সুরযুক্ত মিক্স। এখানে একটি এমপিআইআর সংস্করণ রয়েছে যা কেবল সি ব্যবহার করে (বহনযোগ্যতার কারণে), তবে সি + এএসএম সংস্করণটি উল্লেখযোগ্যভাবে দ্রুত। এমপিআইআর সংস্করণটি আমি এমপিআইআর-র জন্য ব্যবহার করছি। নেটটি সি + এএসএম কে 8 (1 ম জেনার x64) নির্দেশিকা সেটটি ব্যবহার করে, কারণ আমি চাইছিলাম যে এমপিআইআর. নেট সমস্ত x64 পিসিতে চালিত হোক। পরবর্তী নির্দেশের সেটগুলির সংস্করণগুলি আমার ক্রিপ্টো বেঞ্চমার্কে লক্ষণীয়ভাবে দ্রুততর ছিল না, তবে অন্যান্য ক্রিয়াকলাপগুলির ক্ষেত্রে অবশ্যই এটি পৃথক হতে পারে।
জন রেনল্ডস

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
@ জোহানমিচাম আমার প্রোগ্রামটি আপনাকে পরামর্শ দেয় যে আপনি যদি বাম থেকে 386 সংখ্যা সরিয়ে ফেলেন তবে এই সংখ্যাটি প্রাথমিক হয়ে যাবে।
সাবোপটিমাস প্রাইম

1
দয়া করে পোস্ট করার আগে আপনার নম্বরগুলি যাচাই করুন। আপনি যদি আপনার 1276-সংখ্যার নম্বর থেকে বাম 1256 সংখ্যাগুলি সরিয়ে থাকেন তবে আপনি 99999994999999999999 পাবেন যা মূল is
সুপোটিমাস প্রাইম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.