คำนวณโมดูลัสของผกผัน


18

งาน:

มูลค่าการส่งออกสำหรับxที่สองค่าที่กำหนดa mod x = ba,b

การสันนิษฐาน

  • aและbจะเป็นจำนวนเต็มบวกเสมอ
  • จะไม่มีทางแก้สำหรับ x
  • หากมีหลายวิธีให้เอาท์พุทอย่างน้อยหนึ่งวิธี
  • หากไม่มีวิธีแก้ปัญหาให้เอาท์พุทอะไรหรือบ่งชี้ว่าไม่มีวิธีแก้ไข
  • อนุญาตให้ใช้บิวด์อิน (ไม่สนุกเท่าวิธีการทางคณิตศาสตร์อื่น ๆ )
  • เอาต์พุตเป็นจำนวนเต็มเสมอ

ตัวอย่าง

A, B >> POSSIBLE OUTPUTS

5, 2 >> 3
9, 4 >> 5
8, 2 >> 3, 6
6, 6 >> 7, (ANY NUMBER > 6)
8, 7 >> NO SOLUTION
2, 4 >> NO SOLUTION
8, 5 >> NO SOLUTION
10,1 >> 3, 9

นี่คือดังนั้นไบต์ที่ต่ำที่สุดจึงชนะ


จะเกิดข้อผิดพลาดได้หรือไม่หากไม่พบวิธีแก้ไข
ตบมือ

@ConfusedMr_C ในทางเทคนิคที่ไม่ได้ระบุวิธีแก้ปัญหาดังนั้นใช่
Graviton

คำตอบ:


11

JavaScript , 28 27 26 24 23 ไบต์

a=>b=>(a-=b)?a>b&&a:b+1

ลองออนไลน์!

false บ่งชี้ว่าไม่มีวิธีแก้ปัญหา

-1 ขอบคุณ@Arnauld


ทำได้ดีมากและเล่นกอล์ฟได้ดี
Shaggy

ดังนั้นจะเรียกมันว่าคุณจะต้องให้ฟังก์ชั่นด้านนอกชื่อพูดf=...แล้วโทรf(8)(3)? ดูเหมือนว่าโกงเล็กน้อย วิธีปกติในการเรียกใช้ฟังก์ชั่นf(8,3)ซึ่งจะทำให้นิยามฟังก์ชั่นของคุณนานขึ้น?
Steve Bennett

3
@SteveBennett ทรูนิยามเป็นแกงกะหรี่ซึ่งหมายความว่ามันจะต้องเรียกว่าเหมือน(8)(3)แต่มีความเห็นเป็นเอกฉันท์ใน PPCG ที่ที่ได้รับอนุญาต คุณไม่จำเป็นต้องตั้งชื่อให้
eush77

1
@SteveBennett มันสนุกมากที่คุณคิดว่า 26 vs -15 เป็นอะไรก็ได้ยกเว้นฉันทามติที่ชัดเจน ขอให้โชคดีที่พยายามจะโต้แย้ง
eush77

1
@SteveBennett เป็นวิธีที่ 55 ต่อ 1 ฉันทามติที่อ่อนแอ?
Cyoce

6

MATL , 6 ไบต์

tQ:\=f

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

พิจารณาปัจจัยการผลิต8, 2เป็นตัวอย่าง

t    % Implicit input. Duplicate                STACK: 8, 8
Q    % Add 1                                    STACK: 8, 9
:    % Range                                    STACK: 8, [1 2 3 4 5 6 7 8 9]
\    % Modulo                                   STACK: [0 0 2 0 3 2 1 0 8]
=    % Implicit input. Equality comparison      STACK: [0 0 1 0 0 1 0 0 0]
f    % Indices of nonzeros. Implicit display    STACK: [3 6]



3

Groovy ขนาด 48 ไบต์ (ใช้ในตัว):

{a,b->Eval.me(a+"g").modInverse(Eval.me(b+"g"))}

Eval.me(...+"g") - ติด "g" ลงในอินพุตทำให้เป็น BigInteger

modInverse(...) - ดำเนินการโมดูโลผกผัน


Java 8, 70 ไบต์

{a,b->return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(b));}

3

R , 33 28 ไบต์

pryr::f(match(b,a%%1:(a+1)))

ลองออนไลน์!

-4 ไบต์ขอบคุณ Jarko Dubbeldam

-1 ไบต์ขอบคุณ Giuseppe

ส่งคืนNAหากไม่มีวิธีแก้ไข TIO ไม่ได้ติดตั้งไลบรารี pryr ดังนั้นรหัสที่ลิงก์นั้นใช้function(a,b)แทน


pryr::f(which(a%%1:(a+1)==b)) สั้นลง 4 ไบต์
JAD

คุณยังสามารถวางไบต์อื่นโดยใช้match(b,a%%1:(a+1))ซึ่งจะส่งกลับNAค่าที่ขาดหายไป
Giuseppe


1

Mathematica 36 Bytes

a_±b_:=Select[Range[9a],a~Mod~#==b&]

การป้อนข้อมูล:

5 ± 2
9 ± 4
8 ± 2
6 ± 6
8 ± 7
2 ± 4
8 ± 5
10 ± 1

เอาท์พุท:

{3}
{5}
{3, 6}
{7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, \
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, \
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54}
{}
{}
{}
{3, 9}

เมื่อใช้ตัวดำเนินการ ASCII แบบขยายเหล่านี้ในรูปแบบไบนารีพวกเขาต้องการช่องว่างด้านหน้าเมื่อถูกกำหนดมิฉะนั้นโปรแกรมแยกวิเคราะห์จะโยนข้อผิดพลาด a_ ±b_ดังนั้นจึงจะต้องมีการ แต่มันจะสั้นกว่าที่จะใช้CasesแทนSelectฟังก์ชั่นที่ไม่มีชื่อต่อไป:Cases[Range[9#],x_/;#~Mod~x==#2]&
Martin Ender

1

Haskell , 33 ไบต์

เกิดปัญหากับcode.hs: out of memory (requested ??? bytes)หากไม่มีวิธีแก้ปัญหา (หมดเวลากับ TIO ก่อนหน้านั้น):

a!b=[x|x<-[b+1..],mod(a-b)x<1]!!0

ลองออนไลน์!

ขอบคุณที่Ørjan Johansenสำหรับการทำความผิด!


นี้จะช่วยให้คำตอบที่ถูกต้องสำหรับกรณีทดสอบที่แบ่งb a
Ørjan Johansen

1

C # (คอมไพเลอร์ Mono C #) , 57 56 26 ไบต์

คำตอบ Pythonของ Port of Rod ขอบคุณ WW สำหรับ -1 ไบต์

ขอบคุณมากสำหรับ Kevin Cruijssen สำหรับ -30 ไบต์

a=>b=>a-b>b?a-b:a==b?a+1:0

ลองออนไลน์!


1
ยินดีต้อนรับสู่เว็บไซต์! ดูเหมือนว่าคุณจะสามารถลบที่ว่างหลังจากreturnนั้น
ข้าวสาลีตัวช่วยสร้าง

ยินดีต้อนรับสู่ PPCG! สำหรับคำตอบที่ไม่ใช่แบบเรียกซ้ำ C # เป็นวิธีที่ดีที่สุดและสั้นที่สุดในการใช้ฟังก์ชัน lambda ( i=>{/*code here*/}) อย่างไรก็ตามในกรณีนี้เนื่องจากคุณมี 2 อินพุตมันอาจเป็นฟังก์ชั่น currying lambda เพื่อบันทึกไบต์เพิ่มเติม ( a=>b=>{/*code here*/}แทน(a,b)=>{/*code here*/}) นอกจากนี้คุณยังสามารถลบวงเล็บที่อยู่รอบ ๆ if-checks ของคุณ โดยรวมแล้วโดยไม่เปลี่ยนฟังก์ชั่นการทำงานใด ๆ ของคุณจะกลายเป็นa=>b=>a-b>b?a-b:a==b?a+1:0 26 ไบต์
Kevin Cruijssen

นอกจากนี้หากคุณยังไม่เคยเห็นเคล็ดลับสำหรับการเล่นกอล์ฟใน <ทุกภาษา>และเคล็ดลับสำหรับการเล่นกอล์ฟใน C #อาจทั้งน่าสนใจในการอ่าน เพลิดเพลินไปกับการพักผ่อนของคุณ! :)
Kevin Cruijssen

ขอบคุณสำหรับเคล็ดลับฉันจะจำสิ่งเหล่านี้เมื่อเล่นกอล์ฟในอนาคต
Epicness





0

Axiom, 147 128 bytes

g(a:PI,c:PI):Union(List PI,Stream INT)==(a<c=>[];r:=a-c;r=0=>expand((a+1..)::UniversalSegment INT);[b for b in divisors(r)|b>c])

ungolf it and test

--a%b=c return all possible b
f(a:PI,c:PI):Union(List PI, Stream INT)==
    a<c=>[]
    r:=a-c
    r=0=>expand((a+1..)::UniversalSegment INT)
    [b  for b in divisors(r)|b>c]

(3) -> [[i,j,g(i,j)] for i in [5,9,8,6,8,2,8,10] for j in [2,4,2,6,7,4,5,1]]
   (3)
   [[5,2,[3]], [9,4,[5]], [8,2,[3,6]], [6,6,[7,8,9,10,11,12,13,14,15,16,...]],
    [8,7,[]], [2,4,[]], [8,5,[]], [10,1,[3,9]]]
                                                      Type: List List Any

This would find all the solution even the infinite set solution...


0

Pip, 9 bytes

a%,a+2@?b

Takes the two numbers as command-line arguments. Outputs the smallest solution, or nil if no solution exists. Try it online!

Explanation

           a, b are cmdline args (implicit)
  ,a+2     Range from 0 up to but not including a+2
a%         Take a mod each of those numbers
           (Note that a%0 returns nil; it emits a warning, but only if warnings are turned on)
      @?b  Find the index of the first occurrence of b in this list, or nil if it doesn't occur
           Autoprint (implicit)

For example, with input of 8 and 2:

   a+2   10
  ,      [0 1 2 3 4 5 6 7 8 9]
a%       [() 0 0 2 0 3 2 1 0 8]

The 0-based index of the first occurrence of 2 in this list is 3, which is our solution.







0

ORK, 566 bytes

When this program starts:
I have a inputter called I
I have a number called a
I have a number called b
I is to read a
I is to read b
I have a mathematician called M
M's first operand is a
M's second operand is b
M is to subtract
I have a number called n
n is M's result
M's first operand is b
M's second operand is n
M is to compare
I have a scribe called W
If M says it's less then W is to write n
If M says it's less then W is to write "\n"
M's second operand is a
M is to compare
If M says it's equal then W is to write a
If M says it's equal then W is to write a

Try it online!

Objects R Kool. Luckily, however, I didn't need to use any (besides the built-in ones) for this task.


0

F#, 40 bytes

let m a b=Seq.find(fun x->a%x=b){1..a+1}

Try it online!

Pretty straight-forward. Throws a System.Collections.Generic.KeyNotFoundException if no solution can be found.

You could also modify it to Seq.tryFind, which will return an int option, with None if no solution could be found.





0

Whispers v2, 128 bytes

> Input
> Input
>> 1²
>> (3]
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
>> L⋅R
>> Each 9 4 8
> {0}
>> {10}
>> 12∖11
>> Output 13

Try it online!

Returns a set of all possible solutions, and the empty set (i.e. ) when no solution exists.

How it works

Unsurprisingly, it works almost identically to most other answers: it generates a list of numbers and checks each one for inverse modulus with the argument.

If you're familiar with how Whispers' program structure works, feel free to skip ahead to the horizontal line. If not: essentially, Whispers works on a line-by-line reference system, starting on the final line. Each line is classed as one of two options. Either it is a nilad line, or it is a operator line.

Nilad lines start with >, such as > Input or > {0} and return the exact value represented on that line i.e > {0} returns the set {0}. > Input returns the next line of STDIN, evaluated if possible.

Operator lines start with >>, such as >> 1² or >> (3] and denote running an operator on one or more values. Here, the numbers used do not reference those explicit numbers, instead they reference the value on that line. For example, ² is the square command (nn2), so >> 1² does not return the value 12, instead it returns the square of line 1, which, in this case, is the first input.

Usually, operator lines only work using numbers as references, yet you may have noticed the lines >> L=2 and >> L⋅R. These two values, L and R, are used in conjunction with Each statements. Each statements work by taking two or three arguments, again as numerical references. The first argument (e.g. 5) is a reference to an operator line used a function, and the rest of the arguments are arrays. We then iterate the function over the array, where the L and R in the function represent the current element(s) in the arrays being iterated over. As an example:

Let A=[1,2,3,4], B=[4,3,2,1] and f(x,y)=x+y. Assuming we are running the following code:

> [1, 2, 3, 4]
> [4, 3, 2, 1]
>> L+R
>> Each 3 1 2

We then get a demonstration of how Each statements work. First, when working with two arrays, we zip them to form C=[(1,4),(2,3),(3,2),(4,1)] then map f(x,y) over each pair, forming our final array D=[f(1,4),f(2,3),f(3,2),f(4,1)]=[5,5,5,5]

Try it online!


How this code works

Working counter-intuitively to how Whispers works, we start from the first two lines:

> Input
> Input

This collects our two inputs, lets say x and y, and stores them in lines 1 and 2 respectively. We then store x2 on line 3 and create a range A:=[1...x2] on line 4. Next, we jump to the section

>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7

The first thing executed here is line 7, >> Each 5 4, which iterates line 5 over line 4. This yields the array B:=[i%x|iA], where a%b is defined as the modulus of a and b.

We then execute line 8, >> Each 6 7, which iterates line 6 over B, yielding an array C:=[(i%x)=y|iA].

For the inputs x=5,y=2, we have A=[1,2,3,...,23,24,25], B=[0,1,2,1,0,5,5,...,5,5] and C=[0,0,1,0,0,...,0,0]

We then jump down to

>> L⋅R
>> Each 9 4 8

which is our example of a dyadic Each statement. Here, our function is line 9 i.e >> L⋅R and our two arrays are A and C. We multiply each element in A with it's corresponding element in C, which yields an array, E, where each element works from the following relationship:

Ei={0Ci=0AiCi=1

We then end up with an array consisting of 0s and the inverse moduli of x and y. In order to remove the 0s, we convert this array to a set (>> {10}), then take the set difference between this set and {0}, yielding, then outputting, our final result.


-1

C#, 53 bytes (83 with function heading)

static int F(int a, int b){
    for(int i=1;i<=a+1;i++){if(a%i==b)return i;}return 0;
}

Try It Online

First try at codegolf. Probably not the best language to use, nor the most efficient coding.


5
Remove the unnecessary whitespace to save about 10 or more bytes
Mr. Xcoder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.