ইউলার প্রবলেম নাম্বার ১০

problem : The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.Find the sum of all the primes below two million.
https://projecteuler.net/problem=10


প্রবলেমটা বুজতে অসুবিধা হওয়ার কথা না।1 – 2000000 range এর মধ্যে সবগুলা প্রাইম নাম্বারের যোগফল বের করতে হবে।
এখানে মূল বিষয়টি হচ্ছে আপনাকে প্রোগ্রামটি efficient  করতে হবে।
প্রাইম নাম্বার বের করার অনেক গুলো কনসেপ্ট আছে
. n number টি এবং n দ্বারা বিভাজ্য হলে প্রাইম নতুবা প্রাইম না
. 1 থেকে  n/2 range এর মধ্যে যতগুলো  নাম্বার আছে সেগুলো দিয়ে যদি n বিভাজ্য হয় তাহলে n প্রাইম নাম্বার।
. 1 থেকে n পর্যন্ত  যতগুলো নাম্বার আছে তাদের মধ্যে শুধুমাত্র বিজোড় সংখ্যা গুলো চেক করতে হবে।( একমাত্র জোড় প্রাইম নাম্বার )

নাম্বার লজিক দিয়ে সমস্যাটি সমাধান করা যাক

#include<stdio.h>
int main()
{
int i,j;
int long long sum=0;
int const long long num=2000000;
for(i=1;i<=num;i++){
for(j=2;j<i;j++){
if(i%j==0)
break;
} // child loop
if(i==j)
sum=sum+i;
} // parrent loop
printf(" The sum of prime Number below %lld is %lld \n\n",num,sum);
} //end main
view raw gistfile1.c hosted with ❤ by GitHub

কি ব্যাপার execute হচ্ছে না কেন !!?? হবে ধৈর্য ধরে 8/9 মিনিট অপেক্ষা করুন হবে :D
উপরের বাকি লজিক গুলো দিয়ে সল্ভ করলেও একই অবস্থা হবে programming contest আপনার / সেকেন্ড  execution time  দেওয়া থাকে সেখানে এত সময় লাগলে হবে না।

এই ধরনের বড় বড় প্রাইম নাম্বার সমস্যা সমাধানের জন্য আপনাকে সিভ অফ এরাটস্থেনিজ(Sieve of Eratosthenes) অ্যালগরিদম জানতে হবে। সিভ মানে হল ছাঁকনি। এই এলগোরিদমে কম্পোজিট নাম্বারগুলো থেকে প্রাইম নাম্বারগুলোকে ছেঁকে আলাদা করা হয়। আর গ্রিক গণিতবিদ এরাটস্থেনিজ  (২৭৬ পূর্বাব্দ ১৯৫ পূর্বাব্দ) এই এলগোরিদমের আবিষ্কারক বিধায় এলগোরিদমটির নাম দেওয়া হয়েছে সিভ অফ এরাটস্থেনিজ দ্রুততার সাথে প্রাইম নাম্বার বের করার ক্ষেত্রে এলগোরিদমটি এতোটাই কার্যকর যে ২২০০ বছরের পুরোনো এই এলগোরিদম আজও কম্পিউটার বিজ্ঞানে ব্যবহার করা হয়! এর সাহায্যে ১০ মিলিয়নের মধ্যে অবস্থিত সকল প্রাইম নাম্বার অনায়াসেই বের করে ফেলা যায়।

সিভ অফ এরাটস্থেনিজ )Sieve of Eratosthenes)  থিওরিঃ সকল যৌগিক সংখ্যার অন্তত একটি উৎপাদক সংখ্যাটির বর্গমূলের ছোট বা সমান হবেই।অর্থাৎ n সংখ্যাটি prime হবে যদি √n এই সীমার মধ্যে একটি সংখ্যা দিয়েও n বিভাজ্য না হয়। 
সিভ অফ এরাটস্থেনিজ (Sieve of Eratosthenes)  থিওরি প্রয়োগ করে সমাধান




#include <stdio.h>
main()
{
long long int i,j,k,n=2000000,sum=2;
int count;
for(i=3;i<n;i++){
count=1; // assume that it is prime
for(j=2;j<=sqrt(i);j++){
if(i%j==0){
count=0; // it is not prime
break;
} // end control flow
} // end child loop
if(count==1)
sum=sum+i;
} // end parent loop
printf("%lld\n",sum);
} // end main loop
view raw gistfile1.c hosted with ❤ by GitHub


long long int  নেয়ার কারন হল int  by default  size 32 bit  long long  means 32+16+16=64 bit.
প্রথমে ধরা যাক নাম্বারটি প্রাইম তাই count=1child লুপে চেক করা হয়েছে i প্রাইম কিনা এজন্য i কে একবার ভাগ করলেই হবে যদি i%j==0  হয় তাহলে সংখ্যাটি প্রাইম আর তা না হলে লুপ থেকে বের হয়ে যাবে এবং parent লুপে গিয়ে sum=sum+i হবে অর্থাৎ প্রাইম সংখ্যা গুলোকে যোগ করবে।


Projecteuler.net সাইটে আপনার সমাধান সঠিক হলে আপনি  সমাধানের একটি উপর বিস্তারিত অ্যালগরিদম সহ একটি pdf file পাবেন যেখানে  সমস্যা সমাধানের জন্য কি থিওরি ব্যাবহার করতে হবে সব বিস্তারিত ব্যাখ্যা করা আছে। তবে সমাধান না করা পর্যন্ত আপনি pdf file টি পাবেন না। নিচে ফাইলটির ডাউনলোড লিংক দেওয়া আছে ডাউনলোড করে নিতে পারেন,অনেক কিছুই জানতে পারবেন