সি ++ ব্যবহার করে প্রাইম সংখ্যাগুলি খুঁজে পাওয়ার জন্য দ্রুততম অ্যালগরিদম কোনটি? আমি চালুনির অ্যালগরিদম ব্যবহার করেছি তবে আমি আরও দ্রুত এটি চাই!
সি ++ ব্যবহার করে প্রাইম সংখ্যাগুলি খুঁজে পাওয়ার জন্য দ্রুততম অ্যালগরিদম কোনটি? আমি চালুনির অ্যালগরিদম ব্যবহার করেছি তবে আমি আরও দ্রুত এটি চাই!
উত্তর:
সিভিন অফ অ্যাটকিনের একটি খুব দ্রুত বাস্তবায়ন হ'ল ড্যান বার্নস্টেইনের প্রাইমজেন । এই চালনীটি এরিটোস্টিনিসের সিভির চেয়ে বেশি দক্ষ । তার পৃষ্ঠায় কিছু বেঞ্চমার্ক তথ্য রয়েছে।
যদি এটি সত্যিই দ্রুত হতে হয় তবে আপনি প্রাইমগুলির একটি তালিকা অন্তর্ভুক্ত করতে পারেন:
http://www.bigprimes.net/archive/prime/
আপনার যদি কেবল জানতে হবে যে কোনও নির্দিষ্ট সংখ্যাটি মৌলিক সংখ্যা কিনা, উইকিপিডিয়ায় তালিকাভুক্ত বিভিন্ন প্রাথমিক পরীক্ষা রয়েছে । তারা সম্ভবত তা নির্ধারণ করতে বৃহৎ সংখ্যক মৌলিক হয় দ্রুততম পদ্ধতি হয়, যদি একটি সংখ্যা বিশেষত কারণ তারা বলতে পারবে না একটি মৌলিক।
তিনি, তিনি জানেন আমি পুরানো প্রশ্নের জবাব দেওয়া একটি প্রশ্ন নেক্রোম্যান্সার, তবে দক্ষ প্রাইম সংখ্যার পরীক্ষাগুলি বাস্তবায়নের উপায়গুলির জন্য আমি এই প্রশ্নটি নেট সন্ধান করেছি।
এখন অবধি, আমি বিশ্বাস করি যে দ্রুততম প্রাইম নম্বর টেস্টিং অ্যালগরিদম হ'ল স্ট্রং প্রোব্যাবল প্রাইম (এসপিআরপি)। আমি এনভিডিয়া সিইউডিএ ফোরামগুলি থেকে উদ্ধৃত করছি:
সংখ্যা তত্ত্বের সবচেয়ে ব্যবহারিক কুলুঙ্গিগুলির একটি প্রধান সংখ্যা সনাক্তকরণের সাথে সম্পর্কিত। এন দেওয়া হয়েছে, আপনি কীভাবে দক্ষতার সাথে এটি নির্ধারণ করতে পারবেন যে এটি প্রধান কিনা? এটি কেবল একটি থোরিটিক্যাল সমস্যা নয়, কোডে এটি প্রয়োজনীয় সত্যিকারের সমস্যা হতে পারে, সম্ভবত যখন আপনাকে নির্দিষ্ট সীমার মধ্যে প্রাইম হ্যাশ টেবিলের আকারটি গতিশীলরূপে খুঁজে পেতে হবে। যদি এন 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
এখানে একটি 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)
রানটাইম চলবে , সুতরাং আমি জানি না এটি কতটা কার্যকর হবে যেহেতু আপনি কেবল i
0 থেকে ওভারটি করতে পারেন p
এবং বাকী অংশের জন্য পরীক্ষা করতে পারেন ।
x
বোঝায়? মধ্যে (x-1)^P - (x^P-1)
। আপনি কি এই জন্য একটি নমুনা কোড আছে? পূর্ণসংখ্যাটি প্রধান কিনা তা নির্ধারণের জন্য সি ++ এ?
আপনার সমস্যাটি কি কোনও নির্দিষ্ট সংখ্যাটি প্রধান কিনা তা সিদ্ধান্ত নিতে পারে? তারপরে আপনার একটি প্রাথমিক পরীক্ষা (সহজ) দরকার। অথবা আপনার কোনও প্রদত্ত সংখ্যা পর্যন্ত সমস্ত প্রাইম দরকার? সেক্ষেত্রে প্রাইম চালানগুলি ভাল (সহজ, তবে স্মৃতিশক্তি প্রয়োজন)। বা আপনার কি কোনও সংখ্যার প্রধান উপাদানগুলির প্রয়োজন? এর জন্য ফ্যাক্টরাইজেশন প্রয়োজন হবে (যদি আপনি সত্যিই সবচেয়ে দক্ষ পদ্ধতি চান তবে বিশাল সংখ্যক পক্ষে কঠিন)। আপনি যে সংখ্যাটি দেখছেন তা কত বড়? 16 বিট? 32 বিট? বড়?
একটি চতুর এবং দক্ষ উপায় হ'ল প্রাইমগুলির টেবিলগুলি প্রাক-গণনা করা এবং একটি বিট-লেভেল এনকোডিং ব্যবহার করে একটি ফাইলে রাখা। ফাইলটি একটি দীর্ঘ বিট ভেক্টর হিসাবে বিবেচিত হয় যেখানে বিট এন পূর্ণসংখ্যা এনকে উপস্থাপন করে। যদি এন প্রাইম হয় তবে এর বিটটি একটিতে সেট করা হবে এবং অন্যথায় শূন্যে সেট করা হবে। লুকআপ খুব দ্রুত (আপনি বাইট অফসেট এবং কিছুটা মাস্ক গণনা করুন) এবং মেমরিতে ফাইলটি লোড করার প্রয়োজন হয় না।
রবিন-মিলার একটি প্রমিত সম্ভাব্যতা প্রাথমিক পরীক্ষা istic (আপনি এটি চালানোর কে বার এবং ইনপুট সংখ্যা পারেন স্পষ্টভাবে যৌগিক, অথবা এটি সম্ভবত ত্রুটি 4 সম্ভাবনা সঙ্গে মৌলিক -K । (কয়েকশ পুনরাবৃত্তিও এবং এটি প্রায় অবশ্যই তোমাকে সত্যি কহন করা হয়েছে)
রবিন মিলার একটি অ-সম্ভাব্য (ডিটারমিনিস্টিক) বৈকল্পিক রয়েছে ।
দ্য গ্রেট ইন্টারনেট মার্স্নে প্রাইম অনুসন্ধান (জিআইএমপিএস) যা বিশ্বের বৃহত্তম প্রমাণিত প্রাইমের ( ২২,২২,২০7,২৮১ - ১ জুন ২০১ as হিসাবে) বিশ্বের রেকর্ড খুঁজে পেয়েছে , বেশ কয়েকটি অ্যালগরিদম ব্যবহার করে , তবে এগুলি বিশেষ আকারে প্রাইম। তবে উপরের জিআইএমপিএস পৃষ্ঠায় কিছু সাধারণ ডিটারমিনিস্টিক আদিমতার পরীক্ষা অন্তর্ভুক্ত রয়েছে। এগুলি ইঙ্গিত করে দেখা যাচ্ছে যে কোন অ্যালগরিদমটি "দ্রুততম" তা পরীক্ষার জন্য যে সংখ্যার আকারের উপর নির্ভর করে। যদি আপনার নম্বরটি 64৪ বিটের মধ্যে ফিট করে তবে আপনার সম্ভবত কয়েক মিলিয়ন অঙ্কের প্রাইমে কাজ করার উদ্দেশ্যে কোনও পদ্ধতি ব্যবহার করা উচিত নয়।
এটি আপনার আবেদনের উপর নির্ভর করে। কিছু বিবেচনা আছে:
মিলার-রবিন এবং অ্যানালগ পরীক্ষাগুলি একটি নির্দিষ্ট আকারের সংখ্যার জন্য চালুনির চেয়ে কেবল দ্রুত (কোথাও কয়েক মিলিয়ন, আমি বিশ্বাস করি)। এর নীচে একটি ট্রায়াল বিভাগ (যদি আপনার কেবল কয়েকটি সংখ্যা থাকে) বা একটি চালনী দ্রুত ব্যবহার করা হয়।
আমি সবসময় চালনী অ্যালগরিদমের সাথে অনুসরণ করে প্রাইম সংখ্যাগুলি গণনা করার জন্য এই পদ্ধতিটি ব্যবহার করি।
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);
}
আমি আপনাকে সিদ্ধান্ত নেব যে এটি দ্রুত বা না।
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 প্রাথমিক সংখ্যা খুঁজে পেয়েছে ।
i <= (ToCheck / 3)
। এটা হওয়া উচিত i <= (ToCheck / i)
। এটির সাথে, এটি পরিবর্তে 0.1 সেকেন্ডে চলতে পারে।
#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);
}
আমি কোনও পূর্বনির্ধারিত অ্যালগরিদম সম্পর্কে জানি না তবে আমি নিজের তৈরি করেছি যা খুব দ্রুত। এটি 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;
}
#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;
}
(n%2)+1+(3*n)
এক ধরণের সুন্দর যদিও। :)
আমি জানি এটি পরে কিছুটা হলেও এটি অনুসন্ধান থেকে এখানে আসা লোকের পক্ষে কার্যকর হতে পারে। যাইহোক, এখানে কয়েকটি জাভাস্ক্রিপ্ট রয়েছে যা কেবলমাত্র প্রাথমিক উপাদানগুলির পরীক্ষা করা প্রয়োজন এই বিষয়ের উপর নির্ভর করে, সুতরাং কোড দ্বারা উত্পন্ন পূর্ববর্তী প্রাইমগুলি পরবর্তীকালের জন্য পরীক্ষার উপাদান হিসাবে পুনরায় ব্যবহৃত হয়। অবশ্যই, সমস্ত এমনকি এবং আধুনিক 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
}
#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<<", ";
}
}
break;
ও (এন ^ 2) ছাড়া এটি আরও ধীর হতে পারে তবে এটি ইতিমধ্যে কোডিং ত্রুটি হিসাবে দেখা যেতে পারে। প্রাইমসের সাহায্যে সঞ্চয় ও পরীক্ষণ হ'ল ও (এন ^ 2 / (লগ এন) ^ 2), এবং কেবল সংখ্যার বর্গমূলের নীচে প্রাইমগুলি দ্বারা পরীক্ষা করা হ'ল হে (এন ^ 1.5 / (লগ এন) ^ 2)।