প্রাথমিক সংখ্যাগুলি খুঁজে পাওয়ার জন্য দ্রুততম অ্যালগরিদম কোনটি?


183

সি ++ ব্যবহার করে প্রাইম সংখ্যাগুলি খুঁজে পাওয়ার জন্য দ্রুততম অ্যালগরিদম কোনটি? আমি চালুনির অ্যালগরিদম ব্যবহার করেছি তবে আমি আরও দ্রুত এটি চাই!


একটি পুরানো নিবন্ধ আমি পেয়েছি, তবে আকর্ষণীয় দেখাচ্ছে: প্রাইম নাম্বারগুলির সাথে মজা করুন
এমভিকোইলে

29
@ জায়েদার এটি সংখ্যা 7 (111) এর চেয়ে কম সংখ্যায় ব্যর্থ। এটি 1001 = 9 এর জন্যও ব্যর্থ হয়। এবং স্পষ্টতই এটি প্রায় সমস্ত প্রাইমের জন্য ব্যর্থ হয়ে যায় (সাধারণত 2 ^ পি - 1 কেস দেয় না, যা মের্সেন প্রাইম সংখ্যা - শ্রেণিকল্পিতভাবে উত্পন্ন উদাহরণ - যা সর্বদা 111 ... 1 রূপের হবে)
ড্যানিয়েল কেটস

1
@ ক্যাস্পেরস্কি - আপনি কোন চালনার কথা উল্লেখ করেন নি? আপনি সম্ভবত ইরানথোস এর চালনী মানে!
ব্যবহারকারী 2618142

উত্তর:


79

সিভিন অফ অ্যাটকিনের একটি খুব দ্রুত বাস্তবায়ন হ'ল ড্যান বার্নস্টেইনের প্রাইমজেন । এই চালনীটি এরিটোস্টিনিসের সিভির চেয়ে বেশি দক্ষ । তার পৃষ্ঠায় কিছু বেঞ্চমার্ক তথ্য রয়েছে।


10
আসলে আমি মনে করি না প্রাইমজেন সবচেয়ে দ্রুত, বা এমনকি দ্বিতীয় দ্রুততম; ইয়াফু এবং প্রাইমসিভ উভয়ই সাধারণভাবে দ্রুত হয় বলে আমি মনে করি, এবং অবশ্যই 2 ^ 32 এরও বেশি। উভয়ই আটকিন-বার্নস্টেইন চালনার পরিবর্তে ইরোটোথিনিসের চালিত (পরিবর্তিত)।
চার্লস

5
এরিস্টোথিনিস (এসইই) এর প্রাইমসিভ সিভি খুব দ্রুততম অ্যালগরিদম সম্ভব এবং বার্নস্টেইনের এই উত্তরের সাথে যুক্ত হিসাবে চালিত আটকিন সোয়ার যে কোনও প্রয়োগের চেয়ে সবসময় দ্রুত হবে কারণ প্রাইমসিভ SoA এর তুলনায় অপারেশন সংখ্যা হ্রাস করে: 32- বিট সংখ্যার পরিসীমা (2 ^ 32 - 1), প্রাইমসিভ প্রায় 1.2 বিলিয়ন কুল ব্যবহার করে যেখানে সোয়া মোট 1.4 বিলিয়ন সমন্বিত টগল এবং বর্গক্ষেত্র মুক্ত অপারেশন করে, উভয়ই একই জটিলতা এবং প্রায় একই ক্ষেত্রে অপ্টিমাইজ করতে সক্ষম উপায়।
গর্ডনবিবুড

7
অবিরত: বার্নস্টেইন কেবলমাত্র এসওএর সাথে একই কার্যকর চাকা ফ্যাক্টেরাইজেশন ব্যবহার করে এসইও তুলনা করে, এটি একটি 2; 3; 5 চাকা, যার চাকা ব্যবহারের ফলে 32-বিট সংখ্যা পরিসরে প্রায় 1.83 বিলিয়ন কুল আসে; সমমানের অন্যান্য অপ্টিমাইজেশনের জন্য SoE এর এই সীমাবদ্ধ সংস্করণটির তুলনা করার সময় এটি SoA প্রায় 30% দ্রুত করে তোলে । তবে প্রাইমসিভ অ্যালগরিদম 2; 3; 5; 7 চাকা একটি 2; 3; 5; 7; 11; 13; 17 চাকা বিভাগের প্রাক-কুল ব্যবহারের সংখ্যা কমাতে প্রায় 1.2 বিলিয়ন করে চলেছে সমমানের অপারেশন লুপ অপ্টিমাইজেশনের সাথে SoA এর চেয়ে 16.7% দ্রুত।
গর্ডনবিবুড

6
চালিয়ে যাওয়া 2: 2; 3; 5 ফ্যাক্টরিজেশন হুইলটি অ্যালগরিদমের একটি "বেকড-ইন" অংশ হিসাবে উচ্চতর ফ্যাক্টর হুইল ফ্যাক্টেরাইজেশন ব্যবহার করা হয়নি।
গর্ডনবিগুড

4
@ এমন নের্বোন, ডব্লিউপি সঠিক; তবে, সামান্য ভাল গণনীয় জটিলতা সাধারণ ব্যবহারের জন্য দ্রুত অ্যালগরিদম তৈরি করে না। এই মন্তব্যে, আমি সেরিও অফ ইরোটোথিনিস (এসইই) এর সর্বাধিক হুইল ফ্যাক্টেরাইজেশনটির কথা উল্লেখ করছি (যা এটকিন-এসএ-এর সিভের পক্ষে সম্ভব নয়) প্রায় এক বিলিয়ন অবধি সওয়ের জন্য কিছুটা কম অপারেশন তৈরি করে। এই বিন্দুটিরও অনেক উপরে, মেমরির সীমাবদ্ধতাগুলি কাটিয়ে উঠতে সাধারণভাবে একটিকে পৃষ্ঠা বিভাজন ব্যবহার করা প্রয়োজন এবং এটিই তাই ব্যর্থ হয়, ক্রমবর্ধমান পরিসরের সাথে ধীরে ধীরে ধীরে ধীরে ওভারহেডের ক্রমবর্ধমান পরিমাণ গ্রহণ করে।
গর্ডনবি গুড

29

যদি এটি সত্যিই দ্রুত হতে হয় তবে আপনি প্রাইমগুলির একটি তালিকা অন্তর্ভুক্ত করতে পারেন:
http://www.bigprimes.net/archive/prime/

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


2
সমস্ত প্রাইমদের একটি তালিকা? আমি মনে করি আপনি প্রথম কয়েকটি প্রাথমিকের একটি তালিকা বোঝাতে চাইছেন ... :)
j_random_hacker

9
আপনি যদি 100000000 কে কিছু কল করেন তবে হ্যাঁ। :)
জর্জি স্কলি

58
নিশ্চয়ই 100000000 অনন্তের সাথে তুলনা করে "কয়েক";)
টিমোফাই

9
আপনি কেন মনে করেন যে চালকের অফ এটকিন (এসওএ) সেভ অফ ইরোটোথিনিস (এসইও) এর চেয়ে দ্রুত? আপনার লিঙ্কিত উইকিপিডিয়া নিবন্ধের মতো সিউডো কোড ব্যবহার করে কেউ যখন কোনও প্রোগ্রাম প্রয়োগ করে তখন অবশ্যই তা হয় না। যদি SoE সম্ভাব্য অপটিমাইজেশনের একই স্তরের সাথে যেমন SoA এর সাথে ব্যবহার করা হয়, তবে SoA এর তুলনায় খুব বড় Sieving রেঞ্জগুলির জন্য কিছুটা কম অপারেশন হয় তবে সেই লাভটি সাধারণত বৃদ্ধি জটিলতা এবং অফসেটের চেয়ে বেশি হয় এই গণ্য জটিলতার অতিরিক্ত ধ্রুবক ফ্যাক্টর ওভারহেড যেমন ব্যবহারিক অ্যাপ্লিকেশনগুলির জন্য SoE আরও ভাল।
গর্ডনবি গুড

26

তিনি, তিনি জানেন আমি পুরানো প্রশ্নের জবাব দেওয়া একটি প্রশ্ন নেক্রোম্যান্সার, তবে দক্ষ প্রাইম সংখ্যার পরীক্ষাগুলি বাস্তবায়নের উপায়গুলির জন্য আমি এই প্রশ্নটি নেট সন্ধান করেছি।

এখন অবধি, আমি বিশ্বাস করি যে দ্রুততম প্রাইম নম্বর টেস্টিং অ্যালগরিদম হ'ল স্ট্রং প্রোব্যাবল প্রাইম (এসপিআরপি)। আমি এনভিডিয়া সিইউডিএ ফোরামগুলি থেকে উদ্ধৃত করছি:

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

এই সমস্যার সাধারণ ব্যবহারিক সমাধান হ'ল একটি সাধারণ পরীক্ষা যাকে ইউরার সম্ভাব্য প্রাইম টেস্ট বলা হয় এবং আরও শক্তিশালী জেনারাইজেশনকে বলা হয় স্ট্রং প্রব্যাবল প্রাইম (এসপিআরপি)। এটি এমন একটি পরীক্ষা যা কোনও পূর্ণসংখ্যার জন্য এন সম্ভাব্যতার সাথে এটিকে প্রধান বা না হিসাবে শ্রেণিবদ্ধ করতে পারে এবং বারবার পরীক্ষাগুলি নির্ভুলতার সম্ভাবনা বাড়িয়ে তুলতে পারে। পরীক্ষার ধীর অংশটিতে বেশিরভাগই A ^ (N-1) মডুলো এন এর অনুরূপ একটি মান গণনা জড়িত R আরএসএ সর্বজনীন-কী এনক্রিপশন বৈকল্পিক প্রয়োগকারী যে কেউ এই অ্যালগরিদম ব্যবহার করেছেন। এটি বিশাল সংখ্যক (512 বিটের মতো) পাশাপাশি সাধারণ 32 বা 64 বিট ইনট উভয়ের জন্যই কার্যকর।

পরীক্ষার সম্ভাব্য প্রত্যাখ্যান থেকে নির্দিষ্ট পরীক্ষার ইনপামেন্ট প্যারামিটারগুলিকে প্রাক্কলনের মাধ্যমে প্রমিততার একটি নির্দিষ্ট প্রমাণ হিসাবে পরিবর্তন করা যেতে পারে যা সর্বদা এন এর রেঞ্জগুলির জন্য সফল বলে পরিচিত Unfortunately দুর্ভাগ্যবশত এই "সেরা পরিচিত পরীক্ষাগুলি" আবিষ্কার কার্যকরভাবে একটি বিশাল সন্ধান ( আসলে অসীম) ডোমেন। ১৯৮০ সালে, কার্ল পোমারেন্স দ্বারা দরকারী পরীক্ষার প্রথম তালিকা তৈরি করা হয়েছিল (তার চতুর্ভুজ সেভ আলগোরিদম দিয়ে আরএসএ -129 ফ্যাক্টর এক হিসাবে পরিচিত।) পরে জেস্কে ১৯৯৩ সালে ফলাফলের উল্লেখযোগ্য উন্নতি করে। ২০০৪ সালে, ঝাং এবং ট্যাং তত্ত্বটি উন্নত করেছিল এবং অনুসন্ধান ডোমেনের সীমাবদ্ধতা। গ্রেটহাউস এবং লিভিংস্টোন ওয়েবে এখন পর্যন্ত সর্বাধিক আধুনিক ফলাফল প্রকাশ করেছে , একটি বিশাল অনুসন্ধান ডোমেনের সেরা ফলাফল http://math.crg4.com/primes.html এ on

আরও তথ্যের জন্য এখানে দেখুন: http://primes.utm.edu/prove/prove2_3.html এবং http://forums.nvidia.com/index.php?showtopic=70483

আপনার যদি খুব বড় মৌলিক সংখ্যা উত্পন্ন করার জন্য কোনও উপায়ের প্রয়োজন হয় এবং সমস্ত মৌলিক সংখ্যা <একটি পূর্ণসংখ্যা এন উত্পন্ন করার জন্য যত্নশীল না হন তবে আপনি মার্স্নে প্রাইম সংখ্যাগুলি যাচাই করতে লুকাশ-লেহমার পরীক্ষাটি ব্যবহার করতে পারেন। একটি মার্সেন প্রাথমিক সংখ্যা 2 number পি -1 আকারে। আমি মনে করি যে লুকাস-লেহমার পরীক্ষাটি মের্সেন প্রাইম সংখ্যার জন্য দ্রুততম অ্যালগরিদম আবিষ্কার করা হয়েছে discovered

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

এমনকি যদি আপনি যথেষ্ট পরিমাণে প্রাথমিক সংখ্যা আবিষ্কার করেন তবে আপনি কিছু অর্থ উপার্জন করতে পারেন, EFF $ 50K থেকে $ 250K তে পুরস্কার দিচ্ছে: https://www.eff.org/awards/coop


17

এখানে একটি 100% গাণিতিক পরীক্ষা রয়েছে যা পরীক্ষা করে দেখবে যে কোনও সংখ্যা Pপ্রাইম বা সংমিশ্রিত , একে একেএস প্রিমালটি টেস্ট

ধারণাটি সহজ: একটি সংখ্যা দেওয়া আছে P, যদি এর সমস্ত সহগটি (x-1)^P - (x^P-1)ভাগ করে বিভাজ্য হয় Pতবে Pএকটি মৌলিক সংখ্যা, অন্যথায় এটি একটি সংমিশ্রিত সংখ্যা।

উদাহরণস্বরূপ, প্রদত্ত P = 3, বহুপদী দেওয়া হবে:

   (x-1)^3 - (x^3 - 1)
 = x^3 + 3x^2 - 3x - 1 - (x^3 - 1)
 = 3x^2 - 3x

এবং সহগ উভয় দ্বারা বিভাজ্য 3, সুতরাং সংখ্যাটি প্রধান।

এবং উদাহরণস্বরূপ, যেখানে P = 4একটি প্রাথমিক ফলন হবে না:

   (x-1)^4 - (x^4-1)
 = x^4 - 4x^3 + 6x^2 - 4x + 1 - (x^4 - 1)
 = -4x^3 + 6x^2 - 4x

এবং এখানে আমরা দেখতে পাচ্ছি যে 6সহগগুলি বিভাগ দ্বারা বিভাজ্য নয় 4, সুতরাং এটি প্রাথমিক নয়।

বহুপদী (x-1)^Pইচ্ছা P+1শর্তাবলী এবং সমন্বয় ব্যবহার করে পাওয়া যাবে। সুতরাং, এই পরীক্ষা O(n)রানটাইম চলবে , সুতরাং আমি জানি না এটি কতটা কার্যকর হবে যেহেতু আপনি কেবল i0 থেকে ওভারটি করতে পারেন pএবং বাকী অংশের জন্য পরীক্ষা করতে পারেন ।


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

হ্যালো @ কুশা, কী xবোঝায়? মধ্যে (x-1)^P - (x^P-1)। আপনি কি এই জন্য একটি নমুনা কোড আছে? পূর্ণসংখ্যাটি প্রধান কিনা তা নির্ধারণের জন্য সি ++ এ?
কিএললুয়া

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

5

আপনার সমস্যাটি কি কোনও নির্দিষ্ট সংখ্যাটি প্রধান কিনা তা সিদ্ধান্ত নিতে পারে? তারপরে আপনার একটি প্রাথমিক পরীক্ষা (সহজ) দরকার। অথবা আপনার কোনও প্রদত্ত সংখ্যা পর্যন্ত সমস্ত প্রাইম দরকার? সেক্ষেত্রে প্রাইম চালানগুলি ভাল (সহজ, তবে স্মৃতিশক্তি প্রয়োজন)। বা আপনার কি কোনও সংখ্যার প্রধান উপাদানগুলির প্রয়োজন? এর জন্য ফ্যাক্টরাইজেশন প্রয়োজন হবে (যদি আপনি সত্যিই সবচেয়ে দক্ষ পদ্ধতি চান তবে বিশাল সংখ্যক পক্ষে কঠিন)। আপনি যে সংখ্যাটি দেখছেন তা কত বড়? 16 বিট? 32 বিট? বড়?

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


একটি ভাল প্রাথমিকতা পরীক্ষা মূল টেবিলগুলির জন্য যথাযথভাবে ফিট করতে পারে এমন প্রধান মেমোরি ল্যাটেন্সির সাথে প্রতিযোগিতামূলক, সুতরাং এটি এল 2-তে ফিট না হলে আমি এটি ব্যবহার করব না।
চার্লস

3

রবিন-মিলার একটি প্রমিত সম্ভাব্যতা প্রাথমিক পরীক্ষা istic (আপনি এটি চালানোর কে বার এবং ইনপুট সংখ্যা পারেন স্পষ্টভাবে যৌগিক, অথবা এটি সম্ভবত ত্রুটি 4 সম্ভাবনা সঙ্গে মৌলিক -K । (কয়েকশ পুনরাবৃত্তিও এবং এটি প্রায় অবশ্যই তোমাকে সত্যি কহন করা হয়েছে)

রবিন মিলার একটি অ-সম্ভাব্য (ডিটারমিনিস্টিক) বৈকল্পিক রয়েছে

দ্য গ্রেট ইন্টারনেট মার্স্নে প্রাইম অনুসন্ধান (জিআইএমপিএস) যা বিশ্বের বৃহত্তম প্রমাণিত প্রাইমের ( ২২,২২,২০7,২৮১ - ১ জুন ২০১ as হিসাবে) বিশ্বের রেকর্ড খুঁজে পেয়েছে , বেশ কয়েকটি অ্যালগরিদম ব্যবহার করে , তবে এগুলি বিশেষ আকারে প্রাইম। তবে উপরের জিআইএমপিএস পৃষ্ঠায় কিছু সাধারণ ডিটারমিনিস্টিক আদিমতার পরীক্ষা অন্তর্ভুক্ত রয়েছে। এগুলি ইঙ্গিত করে দেখা যাচ্ছে যে কোন অ্যালগরিদমটি "দ্রুততম" তা পরীক্ষার জন্য যে সংখ্যার আকারের উপর নির্ভর করে। যদি আপনার নম্বরটি 64৪ বিটের মধ্যে ফিট করে তবে আপনার সম্ভবত কয়েক মিলিয়ন অঙ্কের প্রাইমে কাজ করার উদ্দেশ্যে কোনও পদ্ধতি ব্যবহার করা উচিত নয়।


2

এটি আপনার আবেদনের উপর নির্ভর করে। কিছু বিবেচনা আছে:

  • কয়েকটি সংখ্যক মৌলিক কিনা আপনার কি কেবল তথ্য দরকার, আপনার একটি নির্দিষ্ট সীমা পর্যন্ত সমস্ত মৌলিক সংখ্যা প্রয়োজন, বা আপনার (সম্ভাব্য) সমস্ত মৌলিক সংখ্যা প্রয়োজন?
  • আপনার সাথে সংখ্যার সংখ্যা কতটা বড়?

মিলার-রবিন এবং অ্যানালগ পরীক্ষাগুলি একটি নির্দিষ্ট আকারের সংখ্যার জন্য চালুনির চেয়ে কেবল দ্রুত (কোথাও কয়েক মিলিয়ন, আমি বিশ্বাস করি)। এর নীচে একটি ট্রায়াল বিভাগ (যদি আপনার কেবল কয়েকটি সংখ্যা থাকে) বা একটি চালনী দ্রুত ব্যবহার করা হয়।


-1

আমি সবসময় চালনী অ্যালগরিদমের সাথে অনুসরণ করে প্রাইম সংখ্যাগুলি গণনা করার জন্য এই পদ্ধতিটি ব্যবহার করি।

void primelist()
 {
   for(int i = 4; i < pr; i += 2) mark[ i ] = false;
   for(int i = 3; i < pr; i += 2) mark[ i ] = true; mark[ 2 ] = true;
   for(int i = 3, sq = sqrt( pr ); i < sq; i += 2)
       if(mark[ i ])
          for(int j = i << 1; j < pr; j += i) mark[ j ] = false;
  prime[ 0 ] = 2; ind = 1;
  for(int i = 3; i < pr; i += 2)
    if(mark[ i ]) ind++; printf("%d\n", ind);
 }

-1

আমি আপনাকে সিদ্ধান্ত নেব যে এটি দ্রুত বা না।

using System;
namespace PrimeNumbers
{

public static class Program
{
    static int primesCount = 0;


    public static void Main()
    {
        DateTime startingTime = DateTime.Now;

        RangePrime(1,1000000);   

        DateTime endingTime = DateTime.Now;

        TimeSpan span = endingTime - startingTime;

        Console.WriteLine("span = {0}", span.TotalSeconds);

    }


    public static void RangePrime(int start, int end)
    {
        for (int i = start; i != end+1; i++)
        {
            bool isPrime = IsPrime(i);
            if(isPrime)
            {
                primesCount++;
                Console.WriteLine("number = {0}", i);
            }
        }
        Console.WriteLine("primes count = {0}",primesCount);
    }



    public static bool IsPrime(int ToCheck)
    {

        if (ToCheck == 2) return true;
        if (ToCheck < 2) return false;


        if (IsOdd(ToCheck))
        {
            for (int i = 3; i <= (ToCheck / 3); i += 2)
            {
                if (ToCheck % i == 0) return false;
            }
            return true;
        }
        else return false; // even numbers(excluding 2) are composite
    }

    public static bool IsOdd(int ToCheck)
    {
        return ((ToCheck % 2 != 0) ? true : false);
    }
}
}

২.৪০ গিগাহার্টজ প্রসেসরের সাহায্যে আমার কোর ২ ডুয়ো ল্যাপটপে ১ থেকে ১,০০,০০০ এর পরিসরের মধ্যে প্রাইম সংখ্যাগুলি খুঁজে পেতে এবং মুদ্রণ করতে প্রায় 82 সেকেন্ড সময় লাগে । এবং এটি 78,498 প্রাথমিক সংখ্যা খুঁজে পেয়েছে


3
এই উপায় খুব ধীর। সমস্যা হচ্ছে i <= (ToCheck / 3)। এটা হওয়া উচিত i <= (ToCheck / i)। এটির সাথে, এটি পরিবর্তে 0.1 সেকেন্ডে চলতে পারে।
নেস

-3
#include<stdio.h>
main()
{
    long long unsigned x,y,b,z,e,r,c;
    scanf("%llu",&x);
    if(x<2)return 0;
    scanf("%llu",&y);
    if(y<x)return 0;
    if(x==2)printf("|2");
    if(x%2==0)x+=1;
    if(y%2==0)y-=1;
    for(b=x;b<=y;b+=2)
    {
        z=b;e=0;
        for(c=2;c*c<=z;c++)
        {
            if(z%c==0)e++;
            if(e>0)z=3;
        }
        if(e==0)
        {
            printf("|%llu",z);
            r+=1;
        }
    }
    printf("|\n%llu outputs...\n",r);
    scanf("%llu",&r);
}    

আরম্ভ করার আগে r ব্যবহার করা হয়
zumalifeguard

-3

আমি কোনও পূর্বনির্ধারিত অ্যালগরিদম সম্পর্কে জানি না তবে আমি নিজের তৈরি করেছি যা খুব দ্রুত। এটি 1 সেকেন্ডেরও কম সময়ে 20 ডিজিটের সংখ্যার প্রক্রিয়া করতে পারে। এই প্রোগ্রামের সর্বাধিক ক্ষমতা 18446744073709551615. প্রোগ্রামটি হ'ল:

#include <iostream>
#include <cmath>
#include <stdlib.h>

using namespace std;

unsigned long long int num = 0;

bool prime() {
    if (num % 2 == 0 || num == 1) {
        return false;
    }

    unsigned long int square_root = sqrt(num);
    for (unsigned long int i = 3; i <= square_root; i += 2) {
        if (num % i == 0) {
            return false;
        }
    }

    return true;
}

int main() {
    do {
        system("cls");
        cout << "Enter number : ";
        cin >> num;

        if (prime()) {
            cout << "The number is a prime number" << endl << endl << endl << endl;
        } else {
            cout << "The number is not a prime number" << endl << endl << endl << endl;
        }
        system("pause");
    } while (1);

    return 0;
}

-4
#include <iostream>

using namespace std;

int set [1000000];

int main (){

    for (int i=0; i<1000000; i++){
        set [i] = 0;
    }
    int set_size= 1000;
    set [set_size];
    set [0] = 2;
    set [1] = 3;
    int Ps = 0;
    int last = 2;

    cout << 2 << " " << 3 << " ";

    for (int n=1; n<10000; n++){
        int t = 0;
        Ps = (n%2)+1+(3*n);
        for (int i=0; i==i; i++){
            if (set [i] == 0) break;
            if (Ps%set[i]==0){
                t=1;
                break;
            }
        }
        if (t==0){
            cout << Ps << " ";
            set [last] = Ps;
            last++;
        }
    }
    //cout << last << endl;


    cout << endl;

    system ("pause");
    return 0;
}

12
"আসলে GOTO ব্যবহার না করেই কীভাবে কাঠামোগত কোড লিখতে হয়" তার উত্তর হতে হবে। এই সমস্ত বিভ্রান্তি কেবল একটি সাধারণ ট্রায়াল বিভাগ কোড করার জন্য! (n%2)+1+(3*n)এক ধরণের সুন্দর যদিও। :)
নেস

1
@ উইল নেস আমি এই প্রশ্নের উত্তর হিসাবে এটি হ্রাস করতে হবে; যখন একটি ম্যাক্রো করবে তখন লুপের জন্য কেন ব্যবহার করবে? :)
রব গ্রান্ট

-4

আমি জানি এটি পরে কিছুটা হলেও এটি অনুসন্ধান থেকে এখানে আসা লোকের পক্ষে কার্যকর হতে পারে। যাইহোক, এখানে কয়েকটি জাভাস্ক্রিপ্ট রয়েছে যা কেবলমাত্র প্রাথমিক উপাদানগুলির পরীক্ষা করা প্রয়োজন এই বিষয়ের উপর নির্ভর করে, সুতরাং কোড দ্বারা উত্পন্ন পূর্ববর্তী প্রাইমগুলি পরবর্তীকালের জন্য পরীক্ষার উপাদান হিসাবে পুনরায় ব্যবহৃত হয়। অবশ্যই, সমস্ত এমনকি এবং আধুনিক 5 মানগুলি প্রথমে ফিল্টার করা হয়। ফলাফল অ্যারে পি তে আসবে এবং এই কোডটি একটি আই 7 পিসিতে 1.5 মিলিয়ন বা প্রায় 20 মিলিয়ন ডলারে 10 মিলিয়ন প্রাইমস ক্রંચ করতে পারে। সিটিতে পুনরায় লিখিত এটি খুব দ্রুত হওয়া উচিত।

var P = [1, 2], j, k, l = 3

for (k = 3 ; k < 10000000 ; k += 2)
{
  loop: if (++l < 5)
  {
    for (j = 2 ; P[j] <= Math.sqrt(k) ; ++j)
      if (k % P[j] == 0) break loop

    P[P.length] = k
  }
  else l = 0
}

2
আপনি যদি প্রচুর সংখ্যক প্রাইম তৈরি করে থাকেন এবং তুলনার জন্য আপনি পি [জে] * পি [জে] <= কে ব্যবহার করুন তবে এটি আপনাকে প্রচুর সমস্যায় ফেলবে, কারণ স্কয়ারটি বেশ ধীর গতির
সাইমন

-11
#include<iostream>
using namespace std;

void main()
{
    int num,i,j,prime;
    cout<<"Enter the upper limit :";
    cin>>num;

    cout<<"Prime numbers till "<<num<<" are :2, ";

    for(i=3;i<=num;i++)
    {
        prime=1;
        for(j=2;j<i;j++)
        {
            if(i%j==0)
            {
                prime=0;
                break;
            }
        }

        if(prime==1)
            cout<<i<<", ";

    }
}

60
এটি এটি সম্পর্কে আপনি সবচেয়ে ধীর যেতে পারেন।
নেস

1
এটি খুব ধীর, যদি উপরের সীমাটি 10000000 বলতে দেয় তবে এই কোডটি অনেক সময় ব্যয় করবে !!
দীক্ষিত সিঙ্গলা

এই কোডটি ও (এন ^ 2 / লগ এন)। break;ও (এন ^ 2) ছাড়া এটি আরও ধীর হতে পারে তবে এটি ইতিমধ্যে কোডিং ত্রুটি হিসাবে দেখা যেতে পারে। প্রাইমসের সাহায্যে সঞ্চয় ও পরীক্ষণ হ'ল ও (এন ^ 2 / (লগ এন) ^ 2), এবং কেবল সংখ্যার বর্গমূলের নীচে প্রাইমগুলি দ্বারা পরীক্ষা করা হ'ল হে (এন ^ 1.5 / (লগ এন) ^ 2)।
নেস

@ উইলনেস সম্ভবত কিছুটা হাইপারবোলিক। তিনি সহজেই 2 এর পরিবর্তে 1 থেকে লুপটি শুরু করতে পারতেন এবং জে <i এর পরিবর্তে একটি জ <= i যোগ করেছিলেন। :)
কেনি কেসন

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