تشخیص اول بودن اعداد بزرگ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تشخیص اول بودن اعداد بزرگ

+1 امتیاز
سلام دوستان

الگوریتمی میخوام که بتونم اول بودن اعداد بزرگ را در زمان خیلی خیلی کوتاهی چک کنم ...

اعداد تا 200 رقم هستند ... و زمان مناسب یعنی در حدود چند ثانیه یا کمتر

میشه راهنماییم کنید

ممنونم.
سوال شده تیر 3, 1393  بوسیله ی Azar (امتیاز 628)   29 43 61
200 رقم میدونی چطور خونده میشه؟! من که نمیدونم !!
مهم نیست که چطور خونده میشه ...
مهمه ؟!!
خوب مهم اینه که نشدنیه فعلا !!! نمیدونم شاید هم بشه قبلنا دیده بودم که برای ضرب کردن اعداد بزرگ از رشته استفاده میکنن ولی اینو نمیدونم!
برای کار روی اعداد خیلی بزرگ می تونید از کتابخونه ی ‌GMP استفاده کنید...
https://gmplib.org

3 پاسخ

+1 امتیاز
سلام.

فهمیدن این که عدد شما اول هست یا نه، یعنی هیچ فاکتوری نداشته باشه، روش رمز گذاری هایی مثل بانک هم استفاده از اعدادی مرکب از اعداد اوله،

اگر قرار بود عددی رو به این سرعت بشه فهمید اوله یا نه، یعنی زیر سوال رفتن همه این داستان ها.

در حال حاضر هیچ روشی برای عمل مزبور وجود نداره، باید صبر کنیم تا سیستمهایی مثل کوانتوم بیاد سر کار.
پاسخ داده شده تیر 3, 1393 بوسیله ی You-See (امتیاز 36)   1 1 5
بله این مسئله در زمان مناسب فک میکنم جزو مسائل Np_complete باشه
ولی من نمیخوام در اون حد زمانش خوب باشه در حد چند ثانیه جواب بده
اصلا میدونی Np-complete چیه نظر میدی!!!!
این مساله P هستش!!!!!
0 امتیاز
سلام

عدد رو بر اعداد  از یک تا نصف خودش تقسیم کنید و مقسوم علیه ها ی آن را شمارش کنید  اگر مقسوم علیهاش برابر 2 بود عدد اوله و یا اینکه از 2 تا یکی مونده به نصف عدد تقسیم کنید اگر تعداد مقسوم علیه هاش صفر شد اونوقت عدد اوله و دو تا تقسیم کمتر انجام شده.
پاسخ داده شده تیر 3, 1393 بوسیله ی امیدوار (امتیاز 872)   21 63 76
دوست عزیز این الگوریتم برای اعداد 1 تا 1000  خوبه
یعنی فقط 4 رقمی
نه 200 رقم
این قانون برای همه اعداد هستش تفاوتی در تعداد ارقام عدد نداره
نع ...
نمیگم برای همه اعداد نیست
اینکه فقط برای اعداد در این بازه در زمان مناسب جواب میده نه برای اعداد تا 200 رقم
می شه تا رادیکال اون عدد ادامه داد.
می شه دوتادوتا هم ادامه داد.
قدیما یه روش غربال گری وجود داشت به نام اراتستن، روش خوبی بود. روشهای جدید تری هم اومدند که با سرچ کوچولو پیدا می شن. فکر می کنم در حال حاضر بهترین روش باشه. اما برای عدد 200 رقمی فکر میکنم حدود چند هفته ای طول بکشه!
+2 امتیاز

سلام!

این متنی که گذاشتم قسمتی از این مطلب در ویکی پدیا هست:‌ تجزیه اعداد طبیعی

 

تجزیه اعداد طبیعی

همچنین ببینید: رکوردهای تجزیه اعداد طبیعی یک تیم در اژانس فدرال امنیت تکنولوژی اطلاعات آلمان (BSI) رکوردی برای تجزیه اعداد نیمه اول که توسط RSA Factoring Challenge پیشنهاد شد بود ثبت کردند. این تیم در تاریخ ۹ می۲۰۰۵ تجزیه RSA-200 (عدد ۶۶۳ بیتی یا ۲۰۰ رقمی در مبنای ۱۰)با استفاده از general number field sieve اعلام کرد. کمی بعد در تاریخ ۴ نوامبر ۲۰۰۵ این تیم تجزیه RSA-640 که عددی کوچکتربا ۱۹۳ رقم در مبنای ۱۰ (۶۴۰ بیت) بود را اعلام کرد. هر دوی این تجزیه‌ها با استفاده ۸۰ عدد سی پی یو AMD Opteron ماه‌های زیادی طول کشید.

 

دشواری و پیچیدگی

اگر یک عدد بزرگ b بیتی نیمه اول باشدهیچ الگوریتمی برای تجزیه آن با (O(bk که k عددی ثابت است پیدا نشده. الگوریتم‌هایی وجود دارند که از (O((1+ε)b به ازای εهای مثبت، سریع تر هستند. یعنی sub-exponential هستند. بهترین الگوریتم از نظر زمانی برای (general number field sieve (GNFS است، که برای اعداد b بیتی زمان اجرا آن به صورت زیر می‌باشد:

O\left(\exp\left(\left(\begin{matrix}\frac{64}{9}\end{matrix} b\right)^{1\over3} (\log b)^{2\over3}\right)\right).

 

 

برای کامپیوترهای معمولی GNFS بهترین الگوریتم برای اعداد بزرگتر از ۱۰۰ رقم می‌باشد. اگرچه Peter Shor در سال ۱۹۹۴ الگوریتمی پیدا کرد که از نظر زمانی چند جمله‌ای بود. و این بسیار مهم خواهد بود وقتی که یک کامپیوتر کوانتومی بزرگ ساخته شود. الگوریتم Shor از (O(b۳ است و از (O(b فضا، برای یک عدد ورودی b بیتی می‌گیرد. در سال ۲۰۰۱ اولین کامپیوتر کوانتومی ۷ کیو بیتی نخستین بار الگوریتم Shor را اجرا نمود و عدد ۱۵ را تجزیه کرد.

 

 

ویرایش: همون طور که دوست خوبمون BlueBlade گفتن، تجزیه کردن با تشخیص اول بودن تفاوت داره... که من موقع پاسخ دادن به این موضوع دقت کافی نداشتم... البته ارتباط این ۲ موضوع هم قابل بحث هست و جالبه...

روش های مختلفی برای تست اول بودن یه عدد هست... بعضی روش ها خیلی جالب هستن... مثلا یه روش احتمالی به این صورت هست:

فرض کنیم عدد صحیح n داده شده، عدد صحیح a ای را انتخاب کنید که نسبت به عدد n اول باشد، باقی مانده ی a به توان n-1 را بر n حساب کنید، اگر نتیجه غیر از ۱ بود یعنی عدد n مرکب است، در غیر این صورت ممکن است اول باشد یا نباشد! که بهش می گیم "شبه اول" در مبنای a.

من برای مثال عدد n رو ۱۴ و a رو ۳ انتخاب کردم، و اتفاقا همین اول مشخص شد که ۱۴ مرکبه! چون ۳ به توان ۱۳ می شه ۱۵۹۴۳۲۳ و باقی مانده ی این عدد بر ۱۴ می شه ۳. پس ۱۴ مرکبه.

این مطلب رو هم در ویکی پدیا بخونید:

Primality test

ویرایش ۲:

یادم رفت که اشاره کنم برای محاسبه ی هم نهشتی نمایی روش های بهتری هست تا محاسبه ی مستقیم اون عبارت بزرگ! این مقاله رو بخونید: Modular exponential

ویرایش ۳:

و بالاخره تا الان در عمل سریع ترین الگوریتم شناخته شده ی همه منظوره (نه فقط برای حالت خاص) برای این کار: ECPP

Eliptic curve primality

یادمه Eliptic curve برای رمز گذاری ارتباطات در شبکه هم استفاده می شد... مثل الگوریتم RSA...

پاسخ داده شده مرداد 6, 1393 بوسیله ی مسعود لپه‌چی (امتیاز 928)   12 31 50
ویرایش شده مرداد 8, 1393 بوسیله ی مسعود لپه‌چی
البته تجزیه کردن با تشخیص اول بودن کاملا تفاوت داره
روش جالبیه ولی برای اول بودن نمیشه ازش استفاده کرد
برای اول نبودن جواب میده ولی باز هم نمیشه استفاده کرد
چون عدد بنابه سوال  اگر ۲۰۰ رقمی باشه(یا حتی 4 رقمی!) a به توان عدد دویست رقمی   رو هیچ کامپیوتری روی کره زمین نمی تونه اجرا کنه ! (تعداد اتم های کل دنیا ۸۰^10 هست اگر هر اتم رو ۱ میلیون عدد هم داخلش ذخیره کنیم بازم فضا کم میاریم !!)
سلام دوست عزیز!
...البته واقعا نیاز به محاسبه ی اون عبارت توان دار نیست.
چون با توجه به این که ما باقی مانده ی اون بر یه عددی رو می خوایم، با این تکنیک هایی که هست دیگه واقعا نیازی نداریم بدونیم اون عدد به توان اون یکی عدد چه قدر می شه... ‌روش های مختلف و بهتری برای محاسبه ی اون عبارت هست... این مقاله رو ببینید توش چند روش رو با مثال توضیح داده:
http://en.wikipedia.org/wiki/Modular_exponentiation
خب اولین مشکلش اینه که احتمالیه
دومین مشکلش پیدا کردن همون عددیه که نسبت به عدد ما اول باشه
در ضمن این راه حل خیلی پیچیه تره از اینها هست
http://en.wikipedia.org/wiki/Primality_test
من یک الگوریتم بهتر میخوام
سلام دوست عزیز!
الگوریتم بهتر رو معرفی کردم...
نمی دونم این روش کجاش باید پیچیده تر باشه... ولی بله روش های احتمالی پیچیده تر هم هست...
ضمنا چک کردن این که عددی نسبت به عدد ما اول باشه، مشکلی فکر نمی کنم داشته باشه، چون یه عدد انتخاب می کنیم، و باقی مانده ی عددمون رو در تقسیم بر این عدد پیدا می کنیم، یا باقی مانده صفره که همون اول می فهمیم عددمون مرکبه! یا باقی مانده صفر نیست که شروع می کنیم به تست کردن!...
به هر حال اگه دنبال بهترین الگوریتم ها هستید، پس الگوریتم منحنی بیضوی رو چک کنید، اما متاسفانه من خودم الان بهش تسلط کافی ندارم که براتون توضیح بیش تر بدم...
علیک سلام
پیدا کردن اون عدد مشکلی نیست ..مشکل اینه که زمان بره
انتخاب کردن یک عدد و امتحان کردن اون در یک عدد 200 رقمی زیاااده...
بله
...