মডুলার গুণিত বিপরীত


22

আপনার টাস্কটি দুটি পূর্ণসংখ্যার সংখ্যা দেওয়া, aএবং bযদি এটি বিদ্যমান থাকে তবে কোনও মডুলো বি এর মডিউলার গুণিত বিপরীত গণনা করা।

এর মডুলার বিপরীত aমডিউল bএকটি সংখ্যা cযেমন যে ac ≡ 1 (mod b)। এই সংখ্যাটি bকোনও জোড়া aএবং এর জন্য অনন্য মডুলো b। এটি কেবল তখনই বিদ্যমান যদি সবচেয়ে বড় সাধারণ বিভাজক aএবং bহয় 1

এই বিষয়ে আপনার আরও তথ্যের প্রয়োজন হলে মডুলার গুণিত বিপরীত উইকিপিডিয়া পৃষ্ঠার সাথে পরামর্শ করা যেতে পারে।

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

ইনপুট দুটি পূর্ণসংখ্যা বা দুটি পূর্ণসংখ্যার একটি তালিকা হিসাবে দেওয়া হয়। আপনার প্রোগ্রামের মধ্যে একটি একক সংখ্যা, অন্তরের মধ্যে থাকা মডিউলার গুণক বিপরীত 0 < c < bবা কোনও বিপরীত নেই এমন একটি মান নির্দেশ করে। মানটি ব্যাপ্তির সংখ্যা বাদে কিছু হতে (0,b)পারে এবং এটি ব্যতিক্রমও হতে পারে। কোনও ক্ষেত্রে বিপরীতমুখী নয় এমন ক্ষেত্রে মানটি একই হওয়া উচিত।

0 < a < b ধরে নেওয়া যায়

বিধি

  • প্রোগ্রামটি এক পর্যায়ে শেষ হওয়া উচিত এবং প্রতিটি পরীক্ষার কেসটি 60 সেকেন্ডেরও কম সময়ে সমাধান করা উচিত
  • স্ট্যান্ডার্ড লুফোলস প্রযোজ্য

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

নীচের পরীক্ষার কেসগুলি বিন্যাসে দেওয়া হয়েছে, a, b -> output

1, 2 -> 1
3, 6 -> Does not exist
7, 87 -> 25
25, 87 -> 7
2, 91 -> 46
13, 91 -> Does not exist
19, 1212393831 -> 701912218
31, 73714876143 -> 45180085378
3, 73714876143 -> Does not exist

স্কোরিং

এটি কোড গল্ফ, তাই প্রতিটি ভাষার জন্য সংক্ষিপ্ততম কোড জিততে পারে।

এটি এবং এটি একই রকম প্রশ্ন, তবে উভয়ই নির্দিষ্ট পরিস্থিতির জন্য জিজ্ঞাসা করে।


6
এটি ফার্মের লিটল উপপাদ্য থেকে পাওয়া যায় যে a এর গুণক বিপরীতটি যদি বিদ্যমান থাকে তবে একটি ^ (ফাই (বি) -1) মোড বি হিসাবে দক্ষতার সাথে গুণ করা যেতে পারে, যেখানে ফাই ইউলারের মোট কার্যকরী: phi (p0 ^ k0 * p1 ^) k1 * ...) = (p0-1) * p0 ^ (k0-1) * (p1-1) * পি 1 ^ (কে 1-1) * ... বলছেন না এটির সংক্ষিপ্ত কোড বাড়ে :)
এনজিএন

1
@ জেনি_মথি অতিরিক্ত ইনপুট নেওয়া সাধারণত অনুমোদিত নয়।
মিঃ এক্সকোডার

3
আমি ছয়টি উত্তর গণনা করছি যা জোরপূর্বক জোর করে বলে মনে হচ্ছে, এবং 60 টেস্টে সমস্ত পরীক্ষার কেস চালানোর সম্ভাবনা নেই (তাদের মধ্যে কিছু প্রথমে একটি স্ট্যাক বা স্মৃতি ত্রুটি দেয়)।
janrjan জোহানসেন

1
@ জিএনএন: আপনি ফার্মারের লিটল উপপাদকে (এফএলটি) এতে অয়লারের উন্নতির সাথে সংঘাত করেছেন। এলামার ফাই ফাংশন সম্পর্কে ফারম্যাট জানতেন না। আরও, এফএলটি এবং এলারের উন্নতি কেবল তখনই প্রযোজ্য যখন gcd (a, b) = 1. শেষ পর্যন্ত, আপনি যে ফর্মটি লিখেছেন, "a ^ (\ phi (b) -1) mod b" 1 এর সাথে একত্রিত হয়, একটি নয় ^ (- 1)। একটি ^ (- 1) পেতে, একটি ^ (\ ফাই (বি) -2) মোড ব্যবহার করুন।
এরিক টাওয়ার

1
@ এরিক টাওয়ার্স ইউলারের ফলাফল। "Gcd (a, b) = 1" সম্পর্কিত - আমি "এটি [বিপরীত] উপস্থিত থাকলে" বলেছিলাম। আপনি কি ফাই (বি) -2 সম্পর্কে নিশ্চিত?
এনজিএন

উত্তর:


11

গণিত, 14 বাইট

বাধ্যতামূলক গণিতের অন্তর্নির্মিত :

ModularInverse

এটি এমন একটি ফাংশন যা দুটি আর্গুমেন্ট নেয় ( aএবং b), এবং যদি কোনও মোড বি উপস্থিত থাকে তবে এর বিপরীত ফিরিয়ে দেয়। যদি তা না হয় তবে এটি ত্রুটি প্রদান করে ModularInverse: a is not invertible modulo b.


7

জাভাস্ক্রিপ্ট (ES6), 79 73 62 61 বাইট

রিটার্নস falseযদি বিপরীত অস্তিত্ব নেই।

এটি বর্ধিত ইউক্লিডিয়ান অ্যালগরিদম ব্যবহার করে এবং সমস্ত পরীক্ষার কেসগুলি প্রায় তাত্ক্ষণিকভাবে সমাধান করে।

f=(a,b,c=!(n=b),d=1)=>a?f(b%a,a,d,c-(b-b%a)/a*d):b<2&&(c+n)%n

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


F (c, a, b = 0, d = 1, n = a) => c? F (a% c, c, d, b- (যেমনটি হিসাবে ফ ফাংশনের নাম লিখতে কেন সম্ভব নয়?) ( এএ% সি) / সি * ডি, এন): এ <2 && (বি + এন)% এন?
রোজলুপি

স্পষ্টভাবে f(x,y)কীওয়ার্ডের আগে না থাকলে @ রসলুপ সর্বদা ফাংশন কল হিসাবে পার্স করা হয় function। অন্যদিকে, একটি বেনামে তীর ফাংশন হিসাবে ঘোষিত হয় (x,y)=>somethingএবং ভেরিয়েবলটিকে f=(x,y)=>somethingফাংশন বরাদ্দ করে f
আর্নৌল্ড

4

জেলি , 2 বাইট

æi

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

এটি মডুলার ইনভার্সের জন্য একটি বিল্টিন ব্যবহার করে এবং কোনও মডুলার বিপরীততার জন্য 0 প্রদান করে।

জেলি , 7 বাইট

R×%⁸’¬T

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

কোনও মডুলার বিপরীতে খালি সেট আউটপুটগুলি (খালি স্ট্রিং হিসাবে উপস্থাপিত)। বৃহত্তম টেস্ট-মামলার জন্য টিআইও-তে মেমরি চলে যায় না, তবে পর্যাপ্ত মেমরির ভিত্তিতে কাজ করা উচিত।

কিভাবে এটা কাজ করে

R×%⁸’¬T  
R        Generate range of b
 ×       Multiply each by a
  %⁸     Mod each by b
    ’    Decrement (Map 1 to 0 and all else to truthy)
     ¬   Logical NOT
      T  Get the index of the truthy element.

আপনি যদি বৃহত্তর টেস্ট-কেসগুলির জন্য কাজ করতে চান তবে এটি (অপেক্ষাকৃত অবহেলিত) সংস্করণটি ব্যবহার করে দেখুন, যার জন্য মেমরির চেয়ে অনেক বেশি সময় প্রয়োজন:

জেলি, 9 বাইট

×⁴%³’¬ø1#

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

কিভাবে এটা কাজ করে

×⁴%³’¬ø1#
        #   Get the first
      ø1      one integer
            which meets:
×⁴            When multiplied by a
  %³          And modulo-d by b
    ’         Decrement
     ¬        Is falsy

4

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

f=lambda a,b:a==1or-~b*f(-b%a,a)/a

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

রিকার্সিভ ফাংশন যে দেয় Trueজন্যprint f(1,2) , যা আমি গ্রহণযোগ্য হতে বিশ্বাস করি, এবং অবৈধ ইনপুট জন্য ত্রুটি।

আমরা খোঁজার চেষ্টা করছেন x মধ্যে ax1(modb)

এটি ax1=kb হিসাবে লেখা যেতে পারে যেখানে k একটি পূর্ণসংখ্যা।

গ্রহণ moda দেয়1kb(moda) । বিয়োগ স্থানান্তরিত দেয়kb1(moda) , যেখানে আমরাk জন্য সমাধান করতে হবে।

দেখতে দেখতে কিভাবে এটি প্রাথমিক দৃশ্যকল্প বর্ণনার অনুরূপ, আমাদের অনুমতি জন্য সমাধান করতে recurse করতে k সঙ্গে ফাংশন কল করে f(b%a,a) (কাজ করে কারণ পাইথন একটি নেতিবাচক যুক্তিযুক্ত মডুলোর জন্য ইতিবাচক মান দেয়)।

যতক্ষণ না জন্য প্রোগ্রাম recurses a হয়ে 1, যা শুধুমাত্র কিছু ঘটে তাহলে মূল a এবং b একটি ত্রুটি একে অপরের সাথে coprime হয় (অর্থাত একটা গুণনশীল ইনভারস্স বিদ্যমান), অথবা প্রান্ত 0 দ্বারা বিভাজন দ্বারা সৃষ্ট।

এই মান k সমীকরণের প্রতিস্থাপিত করা যেতে পারে ax1=kb দিতে x যেমন kb+1a


3

আর + সংখ্যা , 15 বাইট

numbers::modinv

বিপরীত মোড ছাড়া NAতাদের জন্য ফিরে আসে ।ab

এটি চেষ্টা করার জন্য আর-ফিডল!

আর , ৩৩ বাইট (প্রতিদ্বন্দ্বী)

এটি খুব বড় আকারে ব্যর্থ হবে bকারণ এটি আসলে আকারের 32*bবিটের ভেক্টর তৈরি করে ।

function(a,b)which((1:b*a)%%b==1)

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

রিটার্নস integer(0)তাদের জন্য (একটি খালি তালিকা) ainverses গেলিক ভাষার ছাড়া b



3

পাইথন 2 , 51 49 54 53 51 49 বাইট

-1 বাইট অফিগেলাইমকে ধন্যবাদ
-1 বাইট ধন্যবাদ শেগি কে

a,b=input()
i=a<2
while(a*i%b-1)*b%a:i+=1
print+i

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

0কোনও সমাধান না হলে মুদ্রণ ।


1
আউটপুট 0জন্য a=1এবং b=2; পরীক্ষার কেস থেকে এটি আউটপুট করা উচিত 1
শেগি


1
শেগি যেমন উল্লেখ করেছেন, ব্যর্থ হয়েছে2, 1
মিঃ এক্সকোডার

@ শেগির এখনই কাজ করা উচিত
রোড

এটি ইনপুটটির জন্য 60 সেকেন্ডে (টিআইওতে) কোনও উত্তর ফেরত দিতে ব্যর্থ 31,73714876143
ইলমারি করোনেন

3

জাপট , 9 8 বাইট

বিপরীত ক্রমে ইনপুট নেয়। -1কোনও মিল নেই আউটপুট । বড় পূর্ণসংখ্যা বড় হওয়ার সাথে সাথে ক্র্যাপস আউট হয়।

Ç*V%UÃb1

এটা পরীক্ষা করো

  • ETH একটি ভ্রান্ত এবং খুব স্পষ্টতই স্পেস চিহ্নিত করে ধন্যবাদ 1 বাইট সংরক্ষণ করা।

The test input 73714876143,31 seems to produce an out-of-memory error on Firefox (and to crash Chromium). I don't think this is a valid answer.
Ilmari Karonen

@IlmariKaronen: I clearly pointed out that fact in my solution. We can assume infinite memory for the purposes of code golf so the memory issues and crashes do not invalidate this solution.
Shaggy

1
Unfortunately the memory issues also make it impossible to tell whether your code would actually solve the test cases in 60 seconds as stipulated by the challenge. I suspect it would not, even if there was sufficient memory available to make it not crash, but without a computer that can actually run the program for that long there's no way to tell for sure.
Ilmari Karonen


2

Python 3, 49 bytes

lambda a,b:[c for c in range(b)if-~c*a%b==1][0]+1

Try it online!

Python 3, 50 bytes

lambda a,b:[c for c in range(1,b+1)if c*a%b==1][0]

Try it online!

This throws IndexError: list index out of range in case there is no modular multiplicative inverse, as it is allowed by the rules.


This fails to return a result for the input 31,73714876143 in 60 seconds (on TIO).
Ilmari Karonen

@IlmariKaronen Seems to finish in 56 seconds on my machine (Macbook Pro '15)
Mr. Xcoder

2

8th, 6 bytes

Code

invmod

Explanation

invmod is a 8th word that calculates the value of the inverse of a, modulo b. It returns null on overflow or other errors.

Usage and test cases

ok> 1 2 invmod .
1
ok> 3 6 invmod .
null
ok> 7 87 invmod .
25
ok> 25 87 invmod .
7
ok> 2 91 invmod .
46
ok> 13 91 invmod .
null
ok> 19 1212393831 invmod .
701912218
ok> 31 73714876143 invmod .
45180085378
ok> 3 73714876143 invmod .
null


2

J, 28 bytes

4 :'(1=x+.y)*x y&|@^<:5 p:y'

Try it online!

Uses Euler's theorem. Returns 0 if the inverse does not exist.

Explanation

4 :'(1=x+.y)*x y&|@^<:5 p:y'  Input: a (LHS), b (RHS)
4 :'                       '  Define an explicit dyad - this is to use the special
                              form `m&|@^` to perform modular exponentiation
                          y   Get b
                      5 p:    Euler totient
                    <:        Decrement
             x                Get a
                   ^          Exponentiate
               y&|@             Modulo b
       x+.y                   GCD of a and b
     1=                       Equals 1
            *                 Multiply

2

Pyth, 10 bytes

3 bytes saved thanks to @Jakube.

xm%*szdQQ1

Try it here!

Returns -1 for no multiplicative inverse.

Code Breakdown

xm%*szdQQ1      Let Q be the first input.
 m      Q       This maps over [0 ... Q) with a variable d.
   *szd         Now d is multiplied by the evaluated second input.
  %    Q        Now the remained modulo Q is retrieved.
x        1      Then, the first index of 1 is retrieved from that mapping.

Pyth, 15 13 bytes

KEhfq1%*QTKSK

Throws an exception in case no multiplicative inverse exists.

Try it here!

Pyth, 15 bytes

Iq1iQKEfq1%*QTK

This adds lots of bytes for handling the case where no such number exists. The program can be shortened significantly if that case would not need to be handled:

fq1%*QTK

Try it here!


2 bytes saved with KExm%*QdKK1
Jakube

Or 3 bytes if you swap the order of inputs: xm%*szdQQ1
Jakube

@Jakube Thanks a lot, editing!
Mr. Xcoder

How does this work?
Kritixi Lithos

@Cowsquack I've added a completely primitive code breakdown but rn I don't have time to include a complete explanation. Hopefully it is clear enough for now but I'll try to add a more complete explanation soon.
Mr. Xcoder

1

C (gcc), 115 bytes

#define L long long
L g(L a,L b,L c,L d){return a?g(b%a,a,d-b/a*c,c):b-1?0:d;}L f(L a,L b){return(g(a,b,1,0)+b)%b;}

Try it online!

Extended Euclidean algorithm, recursive version

C (gcc), 119 bytes

long long f(a,b,c,d,t,n)long long a,b,c,d,t,n;{for(c=1,d=0,n=b;a;a=t)t=d-b/a*c,d=c,c=t,t=b%a,b=a;return b-1?0:(d+n)%n;}

Try it online!

Extended Euclidean algorithm, iterative version


1

C (gcc), 48 110 104 bytes

#define f(a,b)g(a,b,!b,1,b)
long g(a,b,c,d,n)long a,b,c,d,n;{a=a?g(b%a,a,d,c-(b-b%a)/a*d):!--b*(c+n)%n;}

Try it online!

This should work with all inputs (that fit within a long) within 60 seconds.

Edit. I'm already abusing the n variable so I might as well assume that gcc puts the first assignment in %rax.


1
Alas, this gives wrong results even for fairly small inputs due to integer overflow inside the loop. For example, f(3,1000001) returns 717, which is obviously nonsense (the correct answer is 333334). Also, even if this bug was fixed by using a wider integer type, this brute-force approach would certainly time out for some of the larger test cases given in the challenge.
Ilmari Karonen


0

Axiom, 45 bytes

f(x:PI,y:PI):NNI==(gcd(x,y)=1=>invmod(x,y);0)

0 for error else return z with x*z Mod y =1


0

Python 2, 52 bytes

-3 bytes thanks to Mr. Xcoder.

f=lambda a,b,i=1:i*a%b==1and i or i<b and f(a,b,i+1)

Try it online!

Outputs False on no solution and errors out as b gets larger.

Embedded TIO

I'm just testing out iframes in Stack Snippets and they work absolutely fantastic.


I'm not certain this works, can't i*a%b be 0?
Wheat Wizard

Fails with "maximum recursion depth exceeded" error for input (31,73714876143).
Ilmari Karonen

0

JavaScript (ES6), 42 41 39 38 bytes

Outputs false for no match. Will throw a overflow error as the second number gets to be too large.

x=>y=>(g=z=>x*z%y==1?z:z<y&&g(++z))(1)

0

Jelly, 27 bytes

²%³
⁴Ç⁹Сx⁸
ÆṪ’BṚçL$P%³×gỊ¥

Try it online!

Uses Euler's theorem with modular exponentiation. Since Jelly doesn't have a builtin to perform modular exponentiation, it had to be implemented, and it took most of the bytes.


0

Axiom, 99 bytes

w(a,b,x,u)==(a=0=>(b*b=1=>b*x;0);w(b rem a,a,u,x-u*(b quo a)));h(a,b)==(b=0=>0;(b+w(a,b,0,1))rem b)

it use the function h(); h(a,b) return 0 if error [not exist inverse] otherwise it return the z such that a*z mod b = 1 This would be ok even if arguments are negative...

this would be the general egcd() function that retunr a list of int (so they can be negative too)

egcd(aa:INT,bb:INT):List INT==
   x:=u:=-1   -- because the type is INT
   (a,b,x,u):=(aa,bb,0,1)
   repeat
      a=0=>break
      (q,r):=(b quo a, b rem a)
      (b,a,x,u):=(a,r,u,x-u*q)
   [b,x, (b-x*aa)quo bb]

this is how use it

(7) -> h(31,73714876143)
   (7)  45180085378
                                                    Type: PositiveInteger

i find the base algo in internet from https://pastebin.com/A13ybryc

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.