পাইথ, 83 82 বাইট
=eAQM.^GHQKf%=/H=2;1=gftgT/Q;1HJg~gGHh/H2WtG=*J=gT^2t-K=Kfq1gG^2T1=%*G=^T2Q;hS%_BJ
পরীক্ষা স্যুট
এই প্রোগ্রামটি টোনেলি-শ্যাঙ্কস অ্যালগোরিদম প্রয়োগ করে । আমি উইকিপিডিয়া পৃষ্ঠা ঘনিষ্ঠভাবে অনুসরণ করে এটি লিখেছি। এটি ইনপুট হিসাবে লাগে (n, p)।
বর্গমূলের অনুপস্থিতি নিম্নলিখিত ত্রুটি দ্বারা রিপোর্ট করা হয়েছে:
TypeError: pow() 3rd argument not allowed unless all arguments are integers
এটি পাইথের আরও সাধারণ ক্রিয়াকলাপের শৈলীর বিপরীতে আবশ্যকীয় স্টাইলে লেখা খুব জটিলভাবে গল্ফযুক্ত কোড।
পাইথটির একটি সূক্ষ্ম দিকটি আমি ব্যবহার করছি =, যা যদি তাত্ক্ষণিকভাবে কোনও ভেরিয়েবল দ্বারা অনুসরণ না করা হয় তবে পরবর্তী চলকটির জন্য প্রোগ্রামে এগিয়ে অনুসন্ধান করে, তারপরে নিম্নলিখিত ভেরিয়েবলটির ফলাফলটি সেই পরিবর্তনশীলকে নির্ধারণ করে, তারপরে ফলাফলটি প্রদান করে। আমি উইকিপিডিয়া পৃষ্ঠায় পুরো ব্যাখ্যাটি উল্লেখ করব: টোনেলি-শ্যাঙ্কস অ্যালগরিদম , যেটি আমি প্রয়োগ করছি অ্যালগরিদম হিসাবে।
ব্যাখ্যা:
=eAQ
Aইনপুট হিসাবে একটি 2-tuple নেয়, Gএবং Hযথাক্রমে এবং যথাক্রমে মান নির্ধারণ করে এবং এর ইনপুট ফেরত দেয়। Qএটি প্রাথমিক ইনপুট। eএকটি অনুক্রমের শেষ উপাদানটি প্রদান করে। এই স্নিপেট পর Gহয় n, এবং Hএবং Qহয় p।
M.^GHQ
Mএকটি 2 ইনপুট ফাংশন সংজ্ঞায়িত করে g, যেখানে ইনপুটগুলি হয় Gএবং H। .^পাইথের দ্রুততম মডুলার এক্সপেনসিয়েশন ফাংশন। এই স্নিপেটটি এক্সপেনশনেশন মোডকে gবোঝায় Q।
Kf%=/H=2;1
fমিথ্যা লুপ হওয়া পর্যন্ত একটি পুনরাবৃত্তি সংজ্ঞায়িত করে এবং 1এর ইনপুট হিসাবে প্রদত্ত পুনরাবৃত্তির সংখ্যা প্রদান করে । লুপের প্রতিটি পুনরাবৃত্তির সময়, আমরা H2 দ্বারা ভাগ করে , সেই মানটিতে সেট Hকরে, ফলাফলটি বিজোড় হয় কিনা তা পরীক্ষা করে দেখি। একবার হয়ে গেলে, আমরা থামি। Kএটি গ্রহণের সংখ্যাগুলি সঞ্চয় করে stores
একটি খুব কৃপণ জিনিস =2;বিট। =আগামী পরিবর্তনশীল, যা এর জন্য অনুসন্ধান T, তাই T2. সেট করা হয় তবে Tভিতরে একটি fলুপ, পুনরাবৃত্তির কাউন্টার তাই আমরা ব্যবহার ;মান পেতে Tবিশ্বব্যাপী পরিবেশ থেকে। এটি হোয়াইটস্পেসের কয়েকটি বাইট সংরক্ষণ করার জন্য করা হয় যা অন্যথায় সংখ্যাগুলি পৃথক করার প্রয়োজন হবে।
এই স্নিপেট পর Kহয় SWikipedia নিবন্ধটি (উইকি) থেকে, এবং Hহয় Qউইকি থেকে, এবং Tহয় 2।
=gftgT/Q;1H
এখন, আমাদের একটি চতুষ্কোণ ননরেসিডু মোডের সন্ধান করতে হবে p। আমরা এউলার এর মাপদণ্ড ব্যবহার করে এটিকে জোর করব। /Q2এটি (p-1)/2যেহেতু /মেঝে বিভক্ত, সুতরাং যেখানে ftgT/Q;1প্রথম পছন্দ পূর্ণসংখ্যার সন্ধান করুন । পুনরাহ্বান যে আবার pulls বিশ্বব্যাপী পরিবেশ, যা এখনও 2. হয় এই ফলাফল থেকে উইকি থেকে।TT ^ ((p-1)/2) != 1;Tz
এরপরে, cউইকি থেকে তৈরি করতে , আমাদের প্রয়োজন z^Q, সুতরাং আমরা উপরেরটি মোড়ানো g ... Hএবং ফলাফলটি নির্ধারিত করি T। এখন Tহয় cউইকি থেকে।
Jg~gGHh/H2
এই আলাদা করা যাক: ~gGH। ~এর মতো =, তবে ভেরিয়েবলের মূল মানটি দেয়, তার নতুন মানটি দেয় না। সুতরাং, এটি ফিরে আসে G, যা nউইকি থেকে আসে ।
এই নির্ধারণ Jমান n^((Q+1)/2), যা Rউইকি থেকে।
এখন, নিম্নলিখিতগুলি কার্যকর করে:
~gGH
এই নির্ধারণ Gমান n^Q, যা tউইকি থেকে।
এখন, আমরা আমাদের লুপ ভেরিয়েবল সেট আপ করেছি। M, c, t, Rউইকি থেকে K, T, G, J।
লুপটির শরীর জটিল, তাই আমি এটি যেভাবে লিখেছি তা সাদা স্থানের সাথে উপস্থাপন করতে যাচ্ছি:
WtG
=*J
=
gT^2
t-
K
=Kfq1gG^2T1
=%*G=^T2Q;
প্রথমে, আমরা 1 পরীক্ষা করি কিনা Gতা যদি হয় তবে আমরা লুপটি প্রস্থান করি op
পরবর্তী কোডটি চালিত হয়:
=Kfq1gG^2T1
এখানে, আমরা প্রথম মান জন্য অনুসন্ধান iযেমন যে G^(2^i) mod Q = 1, শুরু 1. এ ফলাফলে সংরক্ষিত হয় K।
=gT^2t-K=Kfq1gG^2T1
এখানে, আমরা এর পুরানো মানটি গ্রহণ করি , বিয়োগফলের 1 টির Kনতুন মান K, বিয়োগ 2, সেই শক্তিতে 2 বাড়াতে এবং তারপরে Tসেই শক্তি মোডে উত্থাপন করি Qএবং তারপরে ফলাফলটি বরাদ্দ করি T। এটি উইকি থেকে Tসমান করে তোলে b।
এটি লাইনটিও শেষ করে যা লুপটি বন্ধ করে দেয় এবং কোনও সমাধান না হলে ব্যর্থ হয়, কারণ সেক্ষেত্রে নতুন মানটি 2 Kএর পুরানো মানের সমান Kহবে -1এবং মডুলার এক্সফেনশনেশন ত্রুটি বাড়িয়ে তুলবে।
=*J
এরপরে, আমরা Jউপরের ফলাফলটি দিয়ে গুণ করব এবং আপডেট Jরেখে এটি আবার জমা করি R।
=^T2
তারপরে আমরা উইকি থেকে ফিরে সেট Tকরে ফলাফলটি আবার স্কোয়ার করে সঞ্চয় করি ।TTc
=%*G=^T2Q
তারপরে আমরা Gসেই ফলাফলটি দিয়ে গুণ করব , এটিকে মডে নিন Qএবং ফলাফলটি আবার স্টোর করে রাখি G।
;
এবং আমরা লুপটি শেষ করি।
লুপ শেষ হওয়ার পরে, Jএটি হল nমোডের একটি বর্গমূল p। সবচেয়ে ছোটটি খুঁজে পেতে, আমরা নিম্নলিখিত কোডটি ব্যবহার করি:
hS%_BJ
_BJতালিকা তৈরি করে Jএবং এটি উপেক্ষা করে, %স্পষ্টভাবে Qতার দ্বিতীয় যুক্তি হিসাবে গ্রহণ করে এবং % ... Qঅনুক্রমের প্রতিটি সদস্যের জন্য প্রয়োগ করার জন্য পাইথের ডিফল্ট আচরণ ব্যবহার করে । তারপরে Sতালিকাটি বাছাই করে hতার সর্বনিম্ন সদস্য গ্রহণ করে।