الگوریتم پی-۱ پولارد

**الگوریتم p-۱ پولارد** یک الگوریتم تجزیه اعداد طبیعی در نظریه اعداد است که توسط  سال ۱۹۷۴ ابداع شده‌است. این الگوریتم خاص منظوره است، بدین معنی که تنها مناسب اعداد طبیعی با انواع خاصی از عوامل است؛ این ساده‌ترین مثال از یک  است.

عواملی که این الگوریتم پیدا می‌کند، عدد اولی است که عدد ما قبل آن، *p-۱*، یک عدد توان-صاف  است؛ مشاهدهٔ ابتدایی این است که با کار در گروه ضربی به  یک عدد مرکب مانند *N*، در همهٔ گروه‌های ضربی عوامل اول *N* نیز کار خواهیم کرد.

موجودیت این الگوریتم ما را به سمت مفهوم اعداد اول امن  سوق می‌دهد که اعداد اولی هستند مانند *p* که *p-۱* دو برابر یک عدد اول  مانند *q* است، بنابراین به صورت حداقلی عددی صاف است. بعضی مواقع این اعداد اول برای اهداف رمزنگاری امن تفسیر می‌شوند ولی ممکن است غیر امن باشند — در توصیه‌های فعلی برای اعداد اول قوی  در رمزنگاری، این شرط لازم ولی غیرکافی است که p-۱ حداقل یک عامل اول بزرگ داشته باشد. اکثر اعداد اول به اندازه کافی بزرگ قوی هستند؛ اگر مشخص شود که یک عدد اول استفاده شده در رمزنگاری غیرقوی است، به نظر می‌رسد که بیشتر از روی عمد بوده تا اینکه از تولید اعداد تصادفی باشد. این کلمات فنی در صنعت رمزنگاری کهنه محسوب می‌شوند.https://web.archive.org/web/20130425010834/http://www.rsa.com/rsalabs/node.asp?id=2217

## مفاهیم اصلی
فرض کنید *n* یک عدد مرکب و *p* یکی از عوامل اول آن باشد. از قضیهٔ کوچک فرما ، می‌دانیم که برای هر عدد صحیح مانند *a* که نسبت به *P* اول باشد و برای هر عدد طبیعی *k* داریم:

:a^{K(p-1)} \equiv 1\pmod{p}

اگر عدد *x* به پیمانهٔ یکی از عوامل *n* همنهشت با ۱ باشد، آنگاه ب.م. م (x-1,n) بر آن عامل بخش‌پذیر است.

ایده اصلی این است که توان را عددی با تعداد بسیار زیادی عامل اول در نظر بگیریم تا یک مضرب بزرگ از p-۱ شود؛ به‌طور کلی ضرب تمام توان‌هایی از اعداد اول را در نظر می‌گیریم که این توان‌های اول از یک عدد مانند *B* بیشتر نباشند. با یک عدد تصادفی *x* شروع می‌کنیم، و مکرراً آن را با x^w \mod n جایگزین می‌کنیم که *w* از همان توان‌های اعداد اول بدست می‌آید. در هر مرحله یا اگر ترجیح می‌دهید در مرحلهٔ آخر چک می‌کنیم که آیا ب. م. م (*x-1*,*n*) مخالف ۱ است یا نه.

## عوامل مختلف
ممکن است که برای تمام عوامل اول *n* مانند *p-۱*، *p* بر اعداد اول کوچک بخش پذیر باشد که در این صورت الگوریتم *P-۱* پولارد دوباره *n* را برمی‌گرداند.

## الگوریتم و زمان اجرا
الگوریتم را می‌توان به صورت زیر نوشت:

**ورودی :** عدد مرکب *n*

**خروجی :** یک عامل اول غیر بدیهی از *n* یا **عدم موفقیت**
# یک کران صافی مانند *B* انتخاب کن.
# *M* را این‌گونه تعریف کن: M = \prod_{\text{primes}~q \le B} q^{ \lfloor \log_q{B} \rfloor } (نکته: محاسبهٔ صریح *M* احتمالاً ضروری نخواهد بود)
# عدد *a* را که نسبت به *n* اول است به‌طور تصادفی انتخاب کن (نکته: در واقع در این جا انتخاب تصادفی a اجباری نیست و می‌توان آن را ثابت در نظر گرفت)
# *g* را این‌گونه محاسبه کن: (*g*  (*a**M* − ۱، *n*. (نکته: می‌توان به پیمانهٔ *n* به توان رساند)
# اگر  آنگاه *g* را برگردان.
# اگر if  آنگاه یک *B* با مقدار بزرگتر انتخاب کن و به خط ۲ برو یا **عدم موفقیت** را برگردان.
# اگر  آنگاه یک *B* با مقدار کوچکتر را انتخاب کن و به خط ۲ برو یا **عدم موفقیت** را برگردان.

اگر در خط ۶، *g* برابر ۱ باشد، آنگاه مشخص می‌شود که تمام عوامل *B*, *p-۱-توان-صاف* نبوده‌اند. اگر در خط ۷، *g = n* باشد، معمولاً این نشان می‌دهد که همهٔ عوامل *B-توان-صاف بوده‌اند*، ولی در موارد نادر ممکن است نشانهٔ این باشد که مرتبهٔ *a* به پیمانهٔ *n* کوچک بوده‌است.
زمان اجرای این الگوریتم از ( است؛ مقادیر بزرگتر *B* باعث کندی الگوریتم می‌شود ولی با احتمال بیشتری عامل اول را پیدا می‌کند.

## چگونه B را انتخاب کنیم؟
از آنجا که الگوریتم افزایشی است، ممکن است به اجرای خود ادامه دهد و کران به‌طور ثابت افزایش یابد.
فرض کنید *p-۱* که در آن *p* کوچکترین عامل اول *n* است را بتوان به صورت یک عدد تصادفی کوچکتر از n√ مدل کرد. ازقضیه دیکسون  احتمال اینکه بزرگترین عامل اول n کمتر از *p* − ۱)*&epsilon;*) باشد تقریباً برابر *&epsilon;*−*&epsilon;* است، بنابراین به احتمال تقریباً ۱/۲۷ عدد *B* با مقدار *n*۱/۶ یک عامل اول بدست می‌دهد.
در عمل وقتی عوامل همگی بزرگ باشند  سریع تر از روش p-۱ پولارد است؛ اجرای الگوریتم *p-۱* تا *B* = ۱۰۶، یک چهارم عوامل ۱۲ رقمی و ۱/۲۷ عوامل ۱۸ رقمی را قبل از روش‌های دیگر پیدا خواهد کرد.

## نوع دیگر دو مرحله‌ای
یک نوع دیگر از الگوریتم اصلی بعضی مواقع استفاده می‌شود؛ به جای اینکه نیاز باشد *p-۱* همهٔ عوامل اولش از *B* کمتر باشد، مستلزم این است که که همهٔ عواملش به جز یک عامل از یک عدد *B*۱ کمتر باشند و عامل باقی‌مانده از یک عدد *B*۲ کمتر باشد که . بعد از اتمام مرحله اول که مانند الگوریتم اصلی است، به جای اینکه

:M' = \prod_{\text{primes}~p \le B_2} q^{ \lfloor \log_q{B_2} \rfloor }


* 'M * را برای *B*۲ محاسبه کنیم و ب. م. م  را چک کنیم، Q را محاسبه می‌کنیم:

:Q = \prod_{\text{primes}~q \in (B_1, B_2]} (H^q - 1)

که در آن  می‌باشد. همچنین چک می‌کنیم که ب. م. م (*Q*, *n*) یک عامل اول غیر بدیهی تولید می‌کند یا نه. دقت کنید مانند قبل، عملیات به توان رساندن می‌تواند به پیمانهٔ *n* باشد.

فرض کنید { … ,*q*۱, *q*۲} اعداد اول متوالی در بازهٔ  باشند و *d**n* = *q**n* − *q**n*−۱ فاصلهٔ دو عدد اول پشت سرهم باشد. به‌طور معمول  و  اعداد زوج هستند. توزیع اعداد اول به گونه‌ای است که *d**n* همیشه نسبتاً کوچک خواهد بود. پیشنهاد می‌شود که  ; بنابراین مقادیر ، ، ، … به پیمانهٔ n را می‌توان در یک جدول ذخیره کرد و  را می‌توان از  محاسبه کرد که این کار نیاز به توان رساندن را کم خواهد کرد.

## جستارهای وابسته
* 

## منابع

* 
* 

## پیوند به بیرون
* روش p-۱ پولارد
*  الگوریتم p-۱ پولارد(Source code)

رده:الگوریتم‌های تجزیه به عامل‌های عدد صحیح