الگویی در اعداد اول

برای این الگو باید اعداد اول رو از ابتدا توضیح بدیم، و یک سری توضیحات بسیار ساده برای درک این الگو مورد نیازه.خب با کوچک ترین عدد اول که 2 هست شروع میکنیماگه همه ی اعداد از 2 به بی نهایت رو به 2 تقسیم کنیم چه چیزی به عنوان "باقیمانده" داریم؟.....0,1,0,1,0,1,0,1که یه حالت تکراری از {0،1} هستشعدد بعدی 3 هست و اگه همه ی اعداد از 3 به بی نهایت بهش تقسیم کنیم چه چیزی به عنوان باقیمانده داریم؟یه حالت تکراری از {0،1،2} هست. الان باید عدد 3 رو کمی بیشتر بررسی کنیم.اگه همه ی اعداد از 3 به بی نهایت به 3 تقسیم بشه، رشته تکراری باقیمانده ها میشه {0،1،2}اگه همه ی اعداد از 4 به بی نهایت به 3 تقسیم بشه، رشته تکراری باقیمانده ها میشه {1،2،0}اگه همه ی اعداد از 5 به بی نهایت به 3 تقسیم بشه، رشته تکراری باقیمانده ها میشه {2،0،1}این نتیجه بدست میاد که باقیمانده ها مثل حلقه عمل میکنن، مثل یه سیاره ای که داره دور خورشید میچرخه، عدد 3 هر 3 ثانیه یه دور کامل میزنه و عدد 2 هر دو ثانیه، ما میخوایم اعداد اول رو به سیاره تشبیه کنیم که دور خورشید در حال چرخشن، و زمان هم 1 ثانیه به 1 ثانیه جلو میره. هر سیاره جدید P هم به P ثانیه زمان نیاز داره تا یه دور کامل بزنه،در ضمن میخوایم به صورت 2 بعدی بهش نگاه کنیم همه اعداد اول هم شروع حرکتشون از 0 درجه هست یعنی جایی که خودشون تقسیم بر خودشون باقیمانده 0 میده.خب اگه قرار باشه یه عدد اولی جدیدی شروع به حرکت کنه؟ باید هیچ سیاره در زاویه 0 درجه قرار نداشته باشه چون به عنوان مثال ثانیه 4 و عدد 2 رو در نظر بگیریم عدد 2 در ثانیه 4 در زاویه 0 درجه قرار داره و 4 تقسیم بر 2 میشه و اول نیست.خب برای اینکه سیاره جدید اضافه کنیم فقط کافیه هیچ سیاره ای در 0 درجه نباشه و بقیه حالات برای ما مهم نیست. یعنی فرقی نداره عدد 3 در زاویه 120 باشه یا 240 فقط نباید در زاویه 0 درجه باشهپس بیایم یه رشته جدید از رشته ی تکراری باقیمانده ها بسازیم. که داخلش باقیمانده 1 یا باقیمانده 2 فرقی با هم ندارن. اسمش هم بزاریم رشته تکراری حرکت:رشته تکراری حرکت (اپدیت شده از رشته باقیمانده ها) اگه همه ی اعداد از 3 به بی نهایت به 3 تقسیم بشه، رشته تکراری حرکت میشه {0،1،1} اگه همه ی اعداد از 4 به بی نهایت به 3 تقسیم بشه، رشته تکراری حرکت میشه {1،1،0} اگه همه ی اعداد از 5 به بی نهایت به 3 تقسیم بشه، رشته تکراری حرکت میشه {1،0،1} مشخصه بعد از حرکت سیاره فقط اولین عدد رشته میره در اخر رشته قرار میگیره.الگوی اعداد اولدیگه بیایم خود الگو رو توضیح بدیم چون هر چیزی که نیاز داشتیم برای این الگو رو توضیح دادیماز عدد 2 شروع میکنیم و از ثانیه 2 و اعداد اول رو دونه دونه پیدا میکنیمعدد 2 اضافه میشه با رشته تکراری حرکت {0،1}1 ثانیه جلو میریم رشته حرکتی عدد 2 تبدیل میشه به {1،0}عدد 3 اضافه میشه چون هیچ سیاره ای در 0 درجه نیست با رشته تکراری حرکت {0،1،1}این سیاره 3 و 2 چند حالت نسبت به هم دارن؟2*3=6 حالت، یعنی این 2 سیاره طوری حرکت میکنن که بعد از 6 حرکت دوباره به جای فعلی برمیگیردن برای مثالباقیمانده 3 تقسیم بر 3=0باقیمانده 3 تقسیم بر 2=16ثانیه بعد (6+3)باقیمانده 9 تقسیم بر 3=0باقیمانده 9 تقسیم بر 2=1و برای 15 و 21 و... همین مقدار هست یعنی یه رشته حرکتی میخوایم حاوی 6 عنصر اسم این رشته رو میزاریم Universal= Uخب برای اینکار رشته حرکتی سیاره 2 رو 3 بار تکرار میکنیم(سیاره 2 حرکت کرده و با "1" شروع میشه){1،0،1،0،1،0}سیاره 3 رو هم رشته حرکتیش رو 2 بار تکرار میکنیم{0،1،1،0،1،1}چون این رشته ها تکراری هستن میتونیم 1000بار تکرارشون کنیم و بازم بگیم این رشته به طول 2000 و 3000 برای این 2 عدد تکراری ان. خب میدونیم بعد از 6 حالت این دو سیاره رفتاری مشابه خواهند داشت چه نسبت به خودشون و چه نسبت به هم.پس یه رشته جهانی یا Universal از این دو رشته باید در بیاریمما میدونیم حتی اگه یک سیاره در صفر درجه باشه جواب صفر میشه پس هر عنصر در جایگاه مشابه رو در هم ضرب میکنیم 0 در هر عددی جواب رو صفر میکنه و فقط اگه دو تا یک باشن میشه 1U={a0*b0,a1*b1,a2*b2,a3*b3,a4*b4,a5*b5} U = {0,0,1,0,1,0} خب اولین حالت که 0 هست و حالت فعلیه و نزدیکترین 1 در 2 ثانیه بعدی و الان ثانیه 3 هستثانیه فعلی 3+ فاصله ثانیه ای نزدیکترن یک (2) =5 عدد اول جدیدخب 2 ثانیه میریم جلو و رشته تکراری حرکت جهانی برابر میشه با U={1,0,1,0,0,0} سیاره 5 وارد مدار میشه با رشته تکراری حرکت {0,1,1,1,1} خب این 3 سیاره چند حالت نسبت به هم دارن؟6*5=30 حالت مختلف خب رشته جهانی جدیدی به طول 30 نیاز داریمرشته جهانی فعلی رو 5 بار تکرار میکنیم تا طولش بشه 30 {101000,101000,101000,101000,101000} رشته حرکت تکراری 5 رو 6 بار تکرار میکنیم تا طولش بشه 30 {01111,01111,01111,01111,01111,01111} و رشته جهانی جدید حاصل ترکیب این 2 تا رشته میشه: new U={001000101000101000100000101000}مشخصه 2 ثانیه بعد عدد 7 تولید میشه در حالی که عدد 9 در 4 ثانیه بعد اول نیست.پیاده سازی برای کامپیوتررشته حرکت جهانی سریع رشد میکنه که حتی برای اعداد اول زیر 100 هم نیاز به کلی فضا برای ذخیره سازیه. پس نیازه در یه قسمتی دیگه رشته حرکت جهانی رو گسترش ندیم مثلا 10 به توان 18 بیت فضا رو استفاده کردیم. میتونیم بگیم تمام اعداد از عدد فعلی تا 10 به توان 18 عدد بعدی رو برای ما محاسبه کنه و اعداد اول رو نشون بده. در این صورت رشته جهانی کوچیکتر میشه با هر حرکت چون حالت دیگه تکراری نیست و لازم نیست اول لیست رو به اخر اضافه کنیم بعد از هر حرکت عنصر های پیمایش شده رو حذف میکنیممیتونیم 2 و 5 رو در نظر نگیریم و برای هر ثانیه بیایم 2 ثانیه 2 ثانیه جلو بریم یا بعد از تولید عدد ببینینم رقم اولش 5 هست فقط مقدار ناچیزی سرعت بیشتر میشه و فضا کمتر میخوادیا اینکه وقتی میدونیم بیشتر اعداد اول نیستن یعنی ما کلی 0 تو رشته داریم میتونیم هر بسته 0 رو مثل حباب در نظر بگیریم مثلا به جای ذخیره 00000000 میتونیم 8 ذخیره کنیم به معنی 8 تا صفر تا 1 بعدیکه یه برنامه نویسی پیچیده میخواد.به جای ضرب هم میشه از گیت AND استفاده کرد چون رشته هامون یا 0 یا 1 هستن و این گیت پرسرعت تره.در حالت کلی میشه بهینه سازی های مختلفی انجام داد و مهم این بود که میخواستیم خود ایده رو توضیح بدیم.