شروع آزمایش حدس گلدباخ!

سلام، خوبی؟!


قبل از هر چیزی بگم که اگه مقاله آزمایش حدس گلدباخ با پایتون 1 رو نخوندی! همین الان بخون ( 1 دقیقه وقت میگیره ) چون بخش اول آموزشه...


حدس گلدباخ با پایتون
حدس گلدباخ با پایتون



همون طور که قرار بود تو این مقاله شروع به کدنویسی با پایتون می کنیم و لذت می بریم...!


خُب...

اصول کدمون اینکه ابتدا اعداد اول رو در میاریم و بعدش با هم جمع می کنیم و در آخر هم چک می کنیم که آیا حدس گلدباخ عزیز درسته یا نه؟!


فرآیند بالا رو ما توی رنج هایی 100 تایی اجرا می کنیم. ( مثلا یکبار 1 تا 100 و بار دیگر 101 تا 200 )

**---یادتون باشه چون لازمش داریم----**


نکته : در این آموزش از class استفاده می کنیم...


نترس...!

اگر چه میدونم خیلی از شما عزیزان حرفه ای هستید و خلاصه این کدها براتون خیلی ساده است ولی شخصی مثل خودم شاید اول اینکه کد زیر رو میبینه بترسه ولی خیالتون راحت ساده تر از این حرفاس...!


  • بازم مانند آموزش های قبلی میگم یک نگاه کلی به کد داشته باش تا در حین آموزش بهتر پیش بریم.
نمونه کد پایتون
نمونه کد پایتون


1- متغیر های local یا محلی:

class در پایتون
class در پایتون

چندتا متغیر local یا محلی با تایپ set برای کلاسمون تعریف می کنیم ...

دلیل محلی تعریف کردن اونها رو هم در فانکشن آخر توضیح میدم...

setOfPrime: برای اعداد اول | setOfNonPrime: برای اعداد غیر اول | check: برای جمع اعداد اول

متغیر بعدی هم که num هست که فعلا نقطه شروع چک کردن هست ( اولین عدد بزرگتر از 2 زوج ).


فعلا در همین حد تو ذهنتون باشه تا توضیح بدم.


2- پیدا کردن اعداد اول

range در پایتون
range در پایتون


خُب ؛ همونطور که گفتم قراره ما این حدس رو توی رنج هایی 100 بسنجیم.

پس مثلا وقتی اعداد اول 1 تا 100 رو بدست میاریم در نوبت بعدی نباید اعداد اول 1 تا 200 را به دست بیاریم بلکه باید اعداد اول 101 تا 200 را به همان قبلی ها اضافه کنیم...!

یکی از دلایل محلی تعریف کردن set ها هم همین بود!

پس حالا در فانکشن اولمون یک set از رنج مورد نظرمون درست می کنیم که بعدا اعداد غیر اول رو از توش دربیاریم و در نتیجه فقط اعداد اول در اون بمونه!

  • از اونجایی که میدونیم عدد 1 اول نیست اون رو از توی لیست با یک if جدا می کنیم که اگه minRange مون یک بود اون رو 2 بزاره!

توی مقاله اعداد اول در پایتون روش پیدا کردن اعداد رو یاد دادم حتما یک نگاه بنداز...!

پس نتیجتا با فانکشن بالا تونستیم اعداد رنج مورد نظر رو به داخل ست محلیمون اضافه کنیم ( که اعداد غیر اول رو از درونش جدا کنیم. )

پیدا کردن اعداد اول در پایتون
پیدا کردن اعداد اول در پایتون


حالا با دستور for تو در تو اعضای اون ستی که در فانکشن قبلی درست کردیم رو چک می کنیم که آیا بر اعداد کوچکتر از خودش بخش پذیره یا نه!

اگه بود اون رو به ست setOfNonPrime اضافه می کنیم. پس از اون هم تمامی اعضای این ست رو از ستی که در فانکشن قبل درست کردیم پاکمش کنیم -> وقتی تمامی اعداد غیر اول رو حذف می کنیم چی میمونه؛ آفرین اعداد اول!

  • اون min و max هم برای اینکه وقتی مثلا اعداد اول 1 تا 100 رو بدست آوردیم در دور بعدی کار اضافه انجام ندیم و 101 تا 200 رو بدست بیاریم و به قبلی ها اضافه کنیم. ( برای بهتر شدن سرعت و هوشمندی کد )


3- جمع اعداد اول

حدس گلدباخ
حدس گلدباخ


حالا باز هم با for تو در تو تمامی اعداد اول رو با هم جمع می کنیم و اگه اون زوج بود به ست check اضافه ی کنیم. ( گلدباخ توی حدس گفته که اعداد زوج از جمع دو عدد اول بدست اومدن )


پیشنهاد میکنم یکبار دیگه 3 مرحله بالا رو مرور کن تا حسابی اوکی بشی ( بقیش ساده است. )


4- بررسی حدس گلدباخ!


حالا می رسیم به بخش مهم و البته ساده...

یادتونه یک متغیر محلی تعریف کردیم و مقدارش رو 4 گذاشتیم؟ الان به کارمون میاد!

با یک حلقه بینهایت و دستور if/else چک می کنیم که آیا num در ست جمع اعداد اول هست یا نه؟

اگه بود که دو تا به num اضافه می کنیم و دوباره چک می کنیم و این فرآیند تا موقعی ادامه داره که num در ست ما باشه و وقتی نباشه وارد else میشه و break می کنیم و num رو چاپ می کنیم...

به مثال توجه کن تا متوجه شی...

فک کن ما اعداد اول رو جمع کردیم و ست مقابل رو داریم -> {4,6,8}

حالا وارد if می شیم -> num=4 پس اون در ست هست -> دو تا بهش اضافه می کنیم.

مرحله بعد -> num=6 پس اون در ست هست -> دو تا بهش اضافه می کنیم.

مرحله بعد -> num=8 پس اون در ست هست -> دو تا بهش اضافه می کنیم.

مرحله بعد -> num=10 این دفعه num در ست نیست و ما حلقه رو break می کنیم

پس ببینید حدس گلدباخ تا عدد 8 درست بود؛ درسته؟!


5- مرحله آخر

آزمایش حدس گلدباخ
آزمایش حدس گلدباخ


توجه کنید که فانکشن بالا خارج از class هست!

توی این فانکشن یک نمونه ( کپسوله میگن نه؟؟ ) از class میسازیم...

حالا توی یک حلقه بینهایت فانکشن های بالا رو فراخوانی می کنیم و نکته مهم اینکه مقدار max و min رو هم میدیم که در ابتدا 1 تا 100 است...

از yield هم استفاده می کنیم که روی سیستم فشار نیاد! ( خروجی تابع چک کننده رو میدیم بهش که اگه یادتون باشه num بود! )

در آخر هم به num1 , num 2 صدتا اضافه می کنیم...

که مثلا در بار اول از 1 تا 100 آزمایش می شود و در نوبت بعدی 101 تا 200 و...

  • و چون ما نمونه رو خارج حلقه ساختیم یکبار ساخته میشه و در نتیجه متغیر های محلیمون حذف نمی شن!!


بخشی از خروجی...

خروجی
خروجی


یاد گرفتی؟

اول ازت تشکر کنم که تا اینجا اومدی...

و اینکه من سعی خودمو کردم کد سریع و بهینه باشه و به هر حال ممکنه بهتر از این هم باشه که ممنون میشم در کامنت مطرح کنی!

نکته دیگر هم من تمام تلاشم رو کردم که واضح توضیح بدم ولی اگه هنوز سوال داری در کامنت بگو حتما توضیح میدهم...

و نکته آخر و مهم!!! کد رو حتما خودت بنویس تا کار دستت بیاد...!


راستی کد رو که ران کردی رکوردی که چاپ کرد رو پرینت کردی رو کامنت کن...!

ببینیم کی بیشتره! من خودم تا فکر کنم 000 13

''' خودمونی ''' اگه حوصله داری بخونش!

راستش من این کد رو از خیلی وقت پیش میخواستم بنویسم که بالاخره وقتی با class آشنا شدم شروع کردم. که در ابتدا بجای ست از لیست استفاده کردم که باز باید موارد تکراری رو حذف می کردم و حتی فانکشن آخری رو هم نداشت که مثلا یکبار 1 تا 100 بار دیگه 1 تا 200 و... خلاصه به طرز فجیهی داغون بود ( مثلا تو 10 دقیقه تا 600 می رسید!!! )

سوتی بدتر هم این بود من فکر می کردم حدس گلدباخ برای کل اعداد هست ولی بعدش فهمیدم برای اعداد زوج است که مجبور شدم کلی تغییر بدم!!

بالاخره با تغییر کلی کدم به نتیجه رسیدم *-*

عرض دیگه ای نیست...

یا علی...