برای این الگو باید اعداد اول رو از ابتدا توضیح بدیم، و یک سری توضیحات بسیار ساده برای درک این الگو مورد نیازه.
خب با کوچک ترین عدد اول که 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=1
6ثانیه بعد (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 در هر عددی جواب رو صفر میکنه و فقط اگه دو تا یک باشن میشه 1
U={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 تا رشته میشه:
مشخصه 2 ثانیه بعد عدد 7 تولید میشه در حالی که عدد 9 در 4 ثانیه بعد اول نیست.
رشته حرکت جهانی سریع رشد میکنه که حتی برای اعداد اول زیر 100 هم نیاز به کلی فضا برای ذخیره سازیه. پس نیازه در یه قسمتی دیگه رشته حرکت جهانی رو گسترش ندیم مثلا 10 به توان 18 بیت فضا رو استفاده کردیم. میتونیم بگیم تمام اعداد از عدد فعلی تا 10 به توان 18 عدد بعدی رو برای ما محاسبه کنه و اعداد اول رو نشون بده. در این صورت رشته جهانی کوچیکتر میشه با هر حرکت چون حالت دیگه تکراری نیست و لازم نیست اول لیست رو به اخر اضافه کنیم بعد از هر حرکت عنصر های پیمایش شده رو حذف میکنیم
میتونیم 2 و 5 رو در نظر نگیریم و برای هر ثانیه بیایم 2 ثانیه 2 ثانیه جلو بریم یا بعد از تولید عدد ببینینم رقم اولش 5 هست فقط مقدار ناچیزی سرعت بیشتر میشه و فضا کمتر میخواد
یا اینکه وقتی میدونیم بیشتر اعداد اول نیستن یعنی ما کلی 0 تو رشته داریم میتونیم هر بسته 0 رو مثل حباب در نظر بگیریم مثلا به جای ذخیره 00000000 میتونیم 8 ذخیره کنیم به معنی 8 تا صفر تا 1 بعدی
که یه برنامه نویسی پیچیده میخواد.
به جای ضرب هم میشه از گیت AND استفاده کرد چون رشته هامون یا 0 یا 1 هستن و این گیت پرسرعت تره.
در حالت کلی میشه بهینه سازی های مختلفی انجام داد و مهم این بود که میخواستیم خود ایده رو توضیح بدیم.