逆モジュラスを計算する


18

タスク:

の値を出力します。xここでa mod x = b、2つの値がありますa,b

仮定

  • aそして、b常に正の整数になります
  • 常に解決策があるとは限りません x
  • 複数のソリューションが存在する場合は、少なくとも1つを出力します。
  • 解決策がない場合は、何も出力しないか、解決策が存在しないという兆候を出力します。
  • 組み込みが許可されています(他の数学的アプローチほど面白くありません)
  • 出力は常に整数です

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技術的には解決策がないことを示しているので、はい。
グラビトン

回答:


11

JavaScript28 27 26 24 23バイト

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

オンラインでお試しください!

false 解決策がないことを示します。

-1ありがとう@Arnauld


よくできて、よくゴルフされた。
シャギー

したがって、それを呼び出すには、外部関数に名前を付けて、たとえばを呼び出す必要がありf=...ますf(8)(3)か?それは少しチートです?関数を呼び出す通常の方法f(8,3)は、関数定義を長くするでしょうか?
スティーブベネット

3
@SteveBennett確かに、定義はカリー化されています。つまり、のよう(8)(3)に呼び出す必要がありますが、PPCGには許可されているコンセンサスあります。ただし、名前を付ける必要はありません。
eush77

1
@SteveBennettそれのあなたが26 -15 VSは何だと思いますどのように楽しまなく、明確なコンセンサス。議論しようとして頑張ってください。
eush77

1
@SteveBennett 55対1の弱いコンセンサスはどうですか?
チョイス

6

MATL、6バイト

tQ:\=f

オンラインでお試しください!または、すべてのテストケースを確認します

説明

入力を考えてみましょう82一例として。

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

R33 28バイト

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

オンラインでお試しください!

Jarko Dubbeldamのおかげで-4バイト。

ジュゼッペのおかげで-1バイト。

NA解決策がない場合に戻ります。TIOにはpryrライブラリがインストールされていないため、function(a,b)代わりにそのリンクのコードが使用されます。


pryr::f(which(a%%1:(a+1)==b)) 4バイト短くなります。
JAD

また、欠損値match(b,a%%1:(a+1))を返すNAを使用して別のバイトをドロップすることもできます。
ジュゼッペ


1

Mathematica 36バイト

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]&
マーティン・エンダー


1

C#(Mono C#コンパイラー)57 56 26バイト

Port of RodのPythonの答え。 -1バイトのWWに感謝します。

-30バイトのKevin Cruijssenに感謝します。

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

オンラインでお試しください!


1
サイトへようこそ!後にスペースを削除できるようですreturn
小麦ウィザード

PPCGへようこそ!非再帰的なC#回答の場合、ラムダ関数(i=>{/*code here*/})を使用するのが常に最善かつ最短です。ただし、この場合、入力が2つあるため、カレンダラムダ関数で、(a=>b=>{/*code here*/}ではなく(a,b)=>{/*code here*/})追加のバイトを保存できます。また、if-checksの周りの括弧を削除できます。合計では、あなたの機能を変更せずに、それはなったa=>b=>a-b>b?a-b:a==b?a+1:0 26バイト
ケビンCruijssen

あなたはまだそれを見ていない場合も、内ゴルフ<すべての言語>のためのヒントC#の中にゴルフのヒントかもしれないが、両方をお読み興味深いこと。滞在を楽しんで!:)
ケビンクルーイッセン

ヒントをありがとうございました。将来ゴルフをするとき、私はこれらを覚えておきます。
エピックネス





0

公理、147128バイト

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

これは、無限集合のソリューションでさえすべてのソリューションを見つけるでしょう...


0

ピップ、9バイト

a%,a+2@?b

2つの数値をコマンドライン引数として受け取ります。最小のソリューションを出力します。ソリューションが存在しない場合はnilを出力します。オンラインでお試しください!

説明

           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)

例えば、入力と8し、2

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

2このリストに最初に出現する0から始まるインデックスは3であり、これがソリューションです。







0

ORK、566バイト

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

オンラインでお試しください!

Oは bjects R Kの 001を。ただし、幸いなことに、このタスクに(組み込みのもの以外に)使用する必要はありませんでした。


0

F#、40バイト

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

オンラインでお試しください!

とても簡単です。System.Collections.Generic.KeyNotFoundException解決策が見つからない場合にスローします。

に変更することもできます。Seq.tryFindこれはint optionNone解決策が見つからない場合にを返します。





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.