বর্গমূল একটি সংখ্যা


13

টাস্কটি নিম্নরূপ: একটি ধনাত্মক পূর্ণসংখ্যা xএবং একটি প্রাথমিক দেওয়া n > x, ক্ষুদ্রতম ধনাত্মক পূর্ণসংখ্যা yযেমন আউটপুট দেয় (y * y) mod n = x। এই প্রশ্নের একটি গুরুত্বপূর্ণ অংশ নীচে নির্দিষ্ট সময়সীমা যা ব্রুট ফোর্স সমাধানগুলি বাদ দেয়।

যদি এরকম কোনও মান না থাকে yতবে আপনার কোডটি আউটপুট করা উচিত N

পরীক্ষার মামলা

(2, 5, N), 
(3, 5, N), 
(4, 5, 2),
(524291, 1048583, N),
(529533, 1048583, N),
(534775, 1048583, 436853),
(540017, 1048583, 73675),
(536870913, 1073741827, 375394238),
(542239622, 1073741827, 267746399),
(547608331, 1073741827, N),
(552977040, 1073741827, 104595351),
(1099511627676, 1099511627791, N),
(1099511627677, 1099511627791, 269691261521),
(1099511627678, 1099511627791, 413834069585),
(1267650600228229401496703204376, 1267650600228229401496703205653, 5312823546347991512233563776),
(1267650600228229401496703204476, 1267650600228229401496703205653, N)
(1267650600228229401496703204576, 1267650600228229401496703205653, N)
(1267650600228229401496703204676, 1267650600228229401496703205653, 79905476259539917812907012931)

ইনপুট এবং আউটপুট

আপনি ইনপুট নিতে এবং সুবিধাজনক যে কোনও উপায়ে আউটপুট দিতে পারেন। আপনি যদি আউটপুট দিতে না চান Nতবে যে কোনও Falseyমান করতে হবে।

বিধিনিষেধ

আপনার কোড অবশ্যই একটি স্ট্যান্ডার্ড ডেস্কটপে 1 মিনিটের নীচে সমস্ত পরীক্ষার কেসগুলির উত্তর দিতে হবে। এই সময়সীমাটি কেবল নিষ্ঠুর বলয়ের উত্তরগুলি প্রতিরোধ করার জন্য এবং আমি আশা করি ভাল উত্তরগুলি সঙ্গে সঙ্গে চলবে antly আপনি কোনও লাইব্রেরি বা বিল্টিন ব্যবহার করতে পারবেন না যা এই সমস্যাটি সমাধান করে বা পরীক্ষা করে যদি কোনও সংখ্যাটি চতুর্ভুজীয় অবশিষ্টাংশ হয়।


2
সুতরাং বড়-পূর্ণসংখ্যার ডেটা টাইপের সমর্থন ছাড়াই ভাষাগুলি এড়িয়ে যায়। করুণা
লুইস মেন্ডো

1
@ লুইসমেডো আপনি 1267650600228229401496703205653নিজের জন্য সমর্থন কোড আপ করতে পারেন না বা আপনার যদি 128 বিট সমর্থন যেমন জিসিসিতে থাকে তবে তা নয় __int128। বিভিন্ন ভাষার জন্য এখানে 256 বিট ইন্ট লাইব্রেরি রয়েছে। সর্বশেষে, প্রচুর ভাষার একটি স্বেচ্ছাসেবী নির্ভুলতা পাঠাগার রয়েছে।

উত্তর:


7

পাইথ, 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তার সর্বনিম্ন সদস্য গ্রহণ করে।


11

পাইথন 2, 166 বাইট

def Q(x,n,a=0):
 e=n/2
 while pow(a*a-x,e,n)<2:a+=1
 w=a*a-x;b=r=a;c=s=1
 while e:
    if e%2:r,s=(r*b+s*c*w)%n,r*c+s*b
    b,c=(b*b+c*c*w)%n,2*b*c;e/=2
 return min(r,-r%n)

%timeit Q(1267650600228229401496703204676,1267650600228229401496703205653) 100 loops, best of 3: 2.83 ms per loop :)

3
কি দুর্দান্ত উত্তর! আপনি পিপিসিজিতে আমার বিশ্বাস পুনরুদ্ধার করেছেন।

5
নবাগত প্রশ্নটি মাফ করবেন, তবে পিপিসিজি কী? পোলিশ পাইথন কোডার্স গ্রুপ?
উল্টো ইঞ্জিনিয়ার

@ ডেভবোল্টম্যান প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ
orlp

6

সেজম্যাথ , 93 বাইট

একটি আরও কঠিন সমস্যার হ্রাস দ্বারা যার জন্য সেজম্যাথের দ্রুত পর্যাপ্ত বিল্টিন রয়েছে।

def f(x,n):g=primitive_root(n);k=Zmod(n)(x).log(g);y=pow(g,k//2,n);return k%2<1and min(y,n-y)

সেজম্যাথসেল এ চেষ্টা করুন


2
সেই হ্রাসটি বেশ মজাদার :)

3

হাস্কেল , 326 বাইট

সাধারণত আমি নিষ্ঠুর বলয়ের উত্তরগুলি পছন্দ করি .. যেহেতু এটি সময়সীমা দ্বারা দৃ strongly়ভাবে নিরুৎসাহিত হয়, তাই আমি সবচেয়ে কার্যকর উপায়টি এখানে জানলাম:

r p=((\r->min(mod(-r)p)r)$).f p
f p x|p==2=x|q x=f 0 0|mod p 4==3=x&div(p+1)4|let(r,s)=foldl i(p-1,0)[1..t 1o]=m$x&(d$r+1)*(b&d s)where q a=1/=a&o;m=(`mod`p);a&0=1;a&e|even e=m$a&d e^2|0<1=m$(a&(e-1))*a;b=[n|n<-[2..],q n]!!0;i(a,b)_|m(x&d a*b&d b)==p-1=(d a,d b+o)|0<1=(d a,d b);o=d p;t y x|even x=t(y+1)(d x)|0<1=y;d=(`div`2)

এটি অনলাইন চেষ্টা করুন!

আমি নিশ্চিত যে এটি আরও কমে যেতে পারে, তবে এটি আপাতত করা উচিত।


আপনি টিআইও কোডটি সংশোধন করতে পারেন যাতে এটি আউটপুট হিসাবে উত্তর দেয়? আমি এই মুহুর্তে "সত্য" পেয়েছি।


@ ল্যাম্বিক testCasesআপনার মূল টিআইও থেকে এইগুলি প্রতিস্থাপন করতে হবে, এটি খুব কমই তাদের কোনও মন্তব্যে ফিট করে।
janrjan জোহানসেন

@ আরজান জোহানসেন অনেক ধন্যবাদ! আমি আমার কোডটি আপনার কোডের সাথে সামঞ্জস্য করে প্রতিস্থাপন করেছি testCases
ბიმო

হু, আমি সেই টিআইও লিঙ্কটির সাথে একটি উদ্ভট ত্রুটি দেখতে পাচ্ছি - যদি আমি এটি ক্লিক করি তবে এতে কোড রয়েছে তবে মেনু বিকল্পগুলি থেকে URL চালানো বা না পাওয়া কার্যকর হয় - তবে যদি আমি ঠিকানা বার থেকে URL টি অনুলিপি করে এটিতে আটকান তবে বিভিন্ন ট্যাব, তারপরে এটি কাজ করে।
janর্জন জোহানসেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.