পাইথ, 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
এর ইনপুট হিসাবে প্রদত্ত পুনরাবৃত্তির সংখ্যা প্রদান করে । লুপের প্রতিটি পুনরাবৃত্তির সময়, আমরা H
2 দ্বারা ভাগ করে , সেই মানটিতে সেট H
করে, ফলাফলটি বিজোড় হয় কিনা তা পরীক্ষা করে দেখি। একবার হয়ে গেলে, আমরা থামি। K
এটি গ্রহণের সংখ্যাগুলি সঞ্চয় করে stores
একটি খুব কৃপণ জিনিস =2;
বিট। =
আগামী পরিবর্তনশীল, যা এর জন্য অনুসন্ধান T
, তাই T
2. সেট করা হয় তবে T
ভিতরে একটি f
লুপ, পুনরাবৃত্তির কাউন্টার তাই আমরা ব্যবহার ;
মান পেতে T
বিশ্বব্যাপী পরিবেশ থেকে। এটি হোয়াইটস্পেসের কয়েকটি বাইট সংরক্ষণ করার জন্য করা হয় যা অন্যথায় সংখ্যাগুলি পৃথক করার প্রয়োজন হবে।
এই স্নিপেট পর K
হয় S
Wikipedia নিবন্ধটি (উইকি) থেকে, এবং H
হয় Q
উইকি থেকে, এবং T
হয় 2
।
=gftgT/Q;1H
এখন, আমাদের একটি চতুষ্কোণ ননরেসিডু মোডের সন্ধান করতে হবে p
। আমরা এউলার এর মাপদণ্ড ব্যবহার করে এটিকে জোর করব। /Q2
এটি (p-1)/2
যেহেতু /
মেঝে বিভক্ত, সুতরাং যেখানে ftgT/Q;1
প্রথম পছন্দ পূর্ণসংখ্যার সন্ধান করুন । পুনরাহ্বান যে আবার pulls বিশ্বব্যাপী পরিবেশ, যা এখনও 2. হয় এই ফলাফল থেকে উইকি থেকে।T
T ^ ((p-1)/2) != 1
;
T
z
এরপরে, 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
করে ফলাফলটি আবার স্কোয়ার করে সঞ্চয় করি ।T
T
c
=%*G=^T2Q
তারপরে আমরা G
সেই ফলাফলটি দিয়ে গুণ করব , এটিকে মডে নিন Q
এবং ফলাফলটি আবার স্টোর করে রাখি G
।
;
এবং আমরা লুপটি শেষ করি।
লুপ শেষ হওয়ার পরে, J
এটি হল n
মোডের একটি বর্গমূল p
। সবচেয়ে ছোটটি খুঁজে পেতে, আমরা নিম্নলিখিত কোডটি ব্যবহার করি:
hS%_BJ
_BJ
তালিকা তৈরি করে J
এবং এটি উপেক্ষা করে, %
স্পষ্টভাবে Q
তার দ্বিতীয় যুক্তি হিসাবে গ্রহণ করে এবং % ... Q
অনুক্রমের প্রতিটি সদস্যের জন্য প্রয়োগ করার জন্য পাইথের ডিফল্ট আচরণ ব্যবহার করে । তারপরে S
তালিকাটি বাছাই করে h
তার সর্বনিম্ন সদস্য গ্রহণ করে।