برنامه تشخیص اعداد اول در پایتون – به زبان ساده


«عدد اول» (Prime Numbers)، عددی طبیعی و بزرگتر از یک است که جز یک و خودش، بر هیچ عدد دیگری بخشپذیر نباشد. برای مطالعه بیشتر پیرامون اعداد اول، مطلب «اعداد اول — به زبان ساده» توصیه میشود. در این مطلب، هدف ارائه روشی برای نوشتن برنامه تشخیص اعداد اول در پایتون است. برای تشخیص اعداد اول، راهکارهای گوناگونی وجود دارد که یکی از محبوبترین آنها، «غربال اراتوستن» (Sieve of Eratosthenes) است. غربال اراتوستن، یکی از روشهای باستانی برای یافتن همه اعداد اول کوچکتر از یک عدد مشخص (مثلا n) است. روش کار به این صورت است که اعداد اول (از دو تا جذر n) یافته میشوند و مضارب آنها (غیر از خودشان) خط میخورند. اعداد خط نخورده، همگی اول هستند. برای مثال، فرض میشود هدف پیدا کردن اعداد اول از ۱ تا n = ۱۰۰ است. با استفاده از غربال اراتوستن، به صورت زیر عمل میشود:
- همه اعداد از ۱ تا ۱۰۰ را مینویسیم.
- عدد ۱ را خط میزنیم.
- دور عدد ۲ خط میکشیم (عدد اول است) و همه مضربهایش را خط میزنیم.
- دور عدد اول بعدی (در اینجا ۳) خط میکشیم و همه مضربهایش را خط میزنیم.
- به مرحله ۴ باز میگردیم و آن مرحله را تکرار میکنیم.
- مراحل بالا را تا جایی که عدد اولی پیدا شود که مضربهایش در جدول خط نخورده باشد، ادامه میدهیم.
- اعداد باقیمانده (که خط نخوردهاند) عدد اول هستند.
البته، با توجه به اینکه یک عامل بزرگتر از n باید مضرب یک عامل کوچکتر باشد که در حال حاضر بررسی شده است، بررسی تا n√ بهینهتر از چک کردن تا n است. راهکارهای بهتری نیز برای تشخیص اعداد اول وجود دارند. در ادامه، با بهرهگیری یک روش دیگر، برنامه تشخیص اعداد اول در پایتون نوشته شده است.
برنامه تشخیص اعداد اول در پایتون
فرض میشود عدد صحیح مثبت N داده شده است. هدف، نوشتن برنامهای در پایتون است که تعیین میکند یک عدد اول است یا خیر. عدد اول، یک عدد طبیعی بزرگتر از ۱ است که به جز خودش و ۱، هیچ مقسومعلیه مثبت دیگری ندارد. اولین اعداد اول عبارتند از {... ,11 ,7 ,5 ,3 , 2}.
مثال:
ورودی: n=11 خروجی: درست (true) ورودی: n=15 خروجی: غلط (false) ورودی: n=1 خروجی: غلط (false)
در حال حاضر، هدف حل کردن این مساله به وسیله روش تکرار شونده است. کار به این صورت انجام میشود که با شروع از ۲ تا n/2 و با استفاده از یک حلقه for، تکرار در همه اعداد انجام و بررسی میشود که آیا n بر عددی در این بازه تقسیمپذیر است یا خیر.
اگر عددی پیدا شد که n بر آن تقسیمپذیر بود، مقدار «false» بازگردانده میشود. اگر هیچ عددی بین ۲ و n/2 یافت نشد که n بر آن تقسیمپذیر باشد، بدین معنا است که n عدد اول است و مقدار «True» بازگردانده میشود. در ادامه، برنامه تشخیص اعداد اول در پایتون ارائه شده است.
خروجی:
11 is a prime number
بهبود برنامه تشخیص اعداد اول در پایتون
میتوان برنامه تشخیص اعداد اول در پایتون را با بهرهگیری از راهکارهای زیر، بهبود بخشید.
- با توجه به اینکه یک عامل بزرگتر از n باید مضرب یک عامل کوچکتر باشد که در حال حاضر بررسی شده است، به جای n، تا n√ بررسی میشود.
- الگوریتم را میتوان با توجه به اینکه همه اعداد اول به استثنای ۲ و ۳، به شکل 6k ± 1 هستند، بهبود داد. این امر بدین دلیل است که همه اعداد صحیح را میتوان به صورت 6k + i برای عدد صحیح k و یا ۴، نشان داد. همانطور که پیشتر بیان شد، ۲ و ۳ استثنا هستند. عدد ۲ بر (6k + 0) ،(6k + 2) ،(6k + 4) و ۳ بر (6k + 3) بخشپذیر است. بنابراین، یک روش کارآمدتر آن است که بررسی شود آیا n بر ۲ یا ۳ بخشپذیر است یا نه و سپس، برای همه اعداد به شکل 6k ± 1 بررسی شود.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامهنویسی C++
- مجموعه آموزشهای ریاضیات
- حل مساله رنگآمیزی گراف با الگوریتم پس گرد — به زبان ساده
- یافتن دور همیلتونی با الگوریتم پس گرد — به زبان ساده
- الگوریتم بازی مار و پله همراه با کد — به زبان ساده
- حل مساله n وزیر با الگوریتم پسگرد (Backtracking) — به زبان ساده
^^
خیلی ممنون ولی این برنامه اشتباهه؟ چون اگر i رو از پنج شروع کنیم به 23 که برسیم + 2 میشود 25 که اول نیست
سلام. ممنون از مقاله خوبتون.
فقط یک مشکل هست. وقتی کد اول احرا میگیرم و num=4 وارد میکنم ، جواب true میاد که اشتباهه.
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
خروجی تابع به مقدار ورودی بستگی دارد. این برنامه در واقع یک تابع است که مقدار ورودی n را از کاربر دریافت و اول بودن یا نبودن آن را بررسی میکند. شما میتوانید کدها را از اینجا کپی کرده و در سرویس Google Colab اجرا کنید. سپس میتوانید تابع را آزمایش کنید. به این صورت که مثلاً میتوانید بعد از اجرای کدهای تابع، یک بلوک کد جدید اضافه و در آن دستور isPrime(25) را وارد و اجرا کنید. در این صورت اگر مقدار ورودی عدد اول باشد، خروجی True و در غیر این صورت، False خواهد بود. ملاحظه خواهید کرد که این تابع یا همان برنامه به درستی کار میکند و هیچ اشتباهی در صورت نگرفته است.
برای شما آرزوی سلامتی و موفقیت داریم.
سلام و تشکر رای آموزش
سوال داشتم در برنامه تشخیص عدداول(اولین برنامه)، دو الست دربرنامه هست else اول به کدام if برمیگرده؟ اگه به if دوم که حاصل تقسیم چک میکنه،چرا ازش عقب ترتایپ شده؟ اشکال من چگونگی اجرای حلقه از2 تاریکی مونده به نصف عدد داده شده است//باتشکر
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
دستور Else اول مربوط به دومین شرط if در برنامه است و در صورتی اجرا میشود که این شرط یعنی عدد اول نبودن مقدار ورودی برقرار نباشد. یعنی اگر عدد مربوطه اول باشد، Else اول اجرا میشود و عبارت «عدد مذکور اول است» در خروجی چاپ میشود. Else دوم هم مربوط به اولین شرط if در برنامه است. در اولین if و پیش از هر چیز، بررسی میشود که آیا عدد ورودی از یک بیشتر است یا خیر. در صورتی که این عدد بیشتر از یک باشد، وارد شرط if دوم خواهیم شد و در غیر اینصورت آخرین Else اجرا و در خروجی عبارت «عدد مذکور اول نیست» چاپ میشود. به طور کلی از طریق تورفتگی یا همان Indentation در کدها میتوان فهمید که هر دستور مربوط به کدام حلقه و قطعه کد از برنامه است.
برای شما آرزوی سلامتی و موفقیت داریم.
def p(n): return not sum([1 for i in range(2,n) if n%i==0])>0