Calcola il modulo inverso


18

L'obiettivo:

Emette un valore per x, dove a mod x = bper due valori dati a,b.

Assunzione

  • ae bsaranno sempre numeri interi positivi
  • Non ci sarà sempre una soluzione per x
  • Se esistono più soluzioni, emetterne almeno una.
  • Se non ci sono soluzioni, non produrre nulla o indicare che non esistono soluzioni.
  • Gli incorporati sono ammessi (non così divertenti come altri approcci matematici)
  • Le uscite sono sempre numeri interi

Esempi

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

Questo è , quindi vince il byte più basso.


Può errore se non viene trovata alcuna soluzione?
applaude

@ConfusedMr_C Tecnicamente ciò non indica alcuna soluzione, quindi sì.
Graviton,

Risposte:


11

JavaScript , 28 27 26 24 23 byte

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

Provalo online!

false indica nessuna soluzione.

-1 grazie @Arnauld


Ben fatto e ben giocato a golf.
Shaggy,

Quindi, per chiamarlo, devi dare un nome alla funzione esterna, per esempio f=..., quindi chiamare f(8)(3)? Sembra un po 'economico? Il modo normale di chiamare una funzione sarebbe f(8,3), che allungherebbe la definizione della funzione?
Steve Bennett,

3
@SteveBennett È vero, la definizione è curry , il che significa che deve essere chiamata come (8)(3), ma c'è un consenso su PPCG che è permesso . Non devi dargli un nome però.
eush77,

1
@SteveBennett È divertente il modo in cui pensi che 26 contro -15 sia tutt'altro che un chiaro consenso. Buona fortuna cercando di contestare.
eush77,

1
@SteveBennett come è 55 a 1 un consenso debole?
Cyoce,

6

MATL , 6 byte

tQ:\=f

Provalo online! Oppure verifica tutti i casi di test .

Spiegazione

Considera gli input 8, 2come esempio.

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 byte (usando incorporato):

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

Eval.me(...+"g") - Appone "g" all'input, rendendolo un BigInteger.

modInverse(...) - Esegue l'operazione modulo inverso.


Java 8, 70 byte

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

3

R , 33 28 byte

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

Provalo online!

-4 byte grazie a Jarko Dubbeldam.

-1 byte grazie a Giuseppe.

Restituisce NAse non c'è soluzione. TIO non ha la libreria pryr installata, quindi utilizza il codice su quel link function(a,b).


pryr::f(which(a%%1:(a+1)==b)) è di 4 byte più breve.
JAD,

è inoltre possibile eliminare un altro byte utilizzando match(b,a%%1:(a+1)), che restituisce NAun valore mancante.
Giuseppe,


1

Mathematica 36 byte

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

Ingresso:

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

Produzione:

{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}

Quando si usano questi operatori ASCII estesi in forma binaria, hanno bisogno di uno spazio davanti quando vengono definiti, altrimenti il ​​parser genera un errore. Quindi dovrebbe essere a_ ±b_. Ma è più breve da usare Casesinvece di Selectuna funzione senza nome:Cases[Range[9#],x_/;#~Mod~x==#2]&
Martin Ender


1

C # (compilatore Mono C #) , 57 56 26 byte

Python di Port of Rod risponde. Grazie a WW per -1 byte.

ENORME grazie a Kevin Cruijssen per -30 byte.

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

Provalo online!


1
Benvenuti nel sito! Sembra che dopo puoi rimuovere lo spazio return.
Wheat Wizard

Benvenuti in PPCG! Per le risposte C # non ricorsive è sempre meglio e più breve usare una funzione lambda ( i=>{/*code here*/}). In questo caso, tuttavia, poiché hai 2 ingressi, può essere una funzione lambda in curry per salvare un byte aggiuntivo ( a=>b=>{/*code here*/}anziché (a,b)=>{/*code here*/}). Inoltre, è possibile rimuovere la parentesi attorno agli if-check. In totale, senza modificare nessuna delle tue funzionalità, diventa a=>b=>a-b>b?a-b:a==b?a+1:0 26 byte
Kevin Cruijssen,

Inoltre, se non l'hai ancora visto, i suggerimenti per giocare a golf in <tutte le lingue> e i suggerimenti per giocare a golf in C # potrebbero essere entrambi interessanti da leggere. Goditi la permanenza! :)
Kevin Cruijssen,

Grazie a tutti per i suggerimenti, li terrò a mente quando giocherò a golf in futuro.
Epicità





0

Assioma, 147 128 byte

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])

scappare e testare

--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

Ciò troverebbe tutta la soluzione anche la soluzione di set infinito ...


0

Pip , 9 byte

a%,a+2@?b

Prende i due numeri come argomenti della riga di comando. Emette la soluzione più piccola o nulla se non esiste una soluzione. Provalo online!

Spiegazione

           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)

Ad esempio, con input di 8e 2:

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

L'indice basato su 0 della prima occorrenza di 2in questo elenco è 3, che è la nostra soluzione.


0

J , 14 byte

(->]){-,~=*1+]

Provalo online!

Traduzione della soluzione Rod's Python 2 .

Come funziona

I rari casi in cui un codice J può essere tradotto direttamente in Python.

(->]){-,~=*1+]  <=>  [(a==b)*(1+b),a-b][a-b>b]
         =*1+]        (a==b)*(1+b)
      -,~            [            ,a-b]
     {                                 [     ]
(->])                                   a-b>b





0

ORK , 566 byte

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

Provalo online!

O bjects R K ool. Fortunatamente, tuttavia, non ho avuto bisogno di usare nessuno (oltre a quelli integrati) per questo compito.


0

F #, 40 byte

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

Provalo online!

Abbastanza diretto. Genera un System.Collections.Generic.KeyNotFoundExceptionse non è possibile trovare una soluzione.

È inoltre possibile modificarlo in Seq.tryFind, che restituirà un int option, Nonese non è stata trovata alcuna soluzione.




0

> <> , 21 byte

Stesso trucco della maggior parte delle soluzioni pubblicate. Innanzitutto, prepariamo tutti i valori necessari nello stack e quindi controlliamo i confronti.

::r::{-:{)?nr=?!;1+n;

Provalo online!


0

Whispers v2 , 128 byte

> 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

Provalo online!

) quando non esiste una soluzione.

Come funziona

Non sorprende che funzioni quasi in modo identico con la maggior parte delle altre risposte: genera un elenco di numeri e controlla ognuno per modulo inverso con l'argomento.

Se hai familiarità con il funzionamento della struttura del programma di Whispers, passa alla linea orizzontale. In caso contrario: sostanzialmente, Whispers lavora su un sistema di riferimento riga per riga, a partire dall'ultima riga. Ogni riga è classificata come una delle due opzioni. O è una linea nilad o è una linea operatore .

Le linee di Nilad iniziano con >, ad esempio> Input o> {0} e restituiscono il valore esatto rappresentato su quella linea, ovvero > {0}restituisce l'insieme{0}. > Inputrestituisce la riga successiva di STDIN, valutata se possibile.

Le righe dell'operatore iniziano con >>, come >> 1²o >> (3]e indicano l'esecuzione di un operatore su uno o più valori. Qui, i numeri usati non fanno riferimento a quei numeri espliciti, invece fanno riferimento al valore su quella riga. Ad esempio, ²è il comando quadrato (nn2), quindi >> 1²non restituisce il valore12, invece restituisce il quadrato della riga 1 , che, in questo caso, è il primo input.

Di solito, le linee dell'operatore funzionano solo usando i numeri come riferimenti, ma potresti aver notato le linee >> L=2e >> L⋅R. Questi due valori Le R, sono usati insieme alle Eachistruzioni. Eachle dichiarazioni funzionano prendendo due o tre argomenti, sempre come riferimenti numerici. Il primo argomento (ad es. 5) È un riferimento a una riga dell'operatore che utilizza una funzione e il resto degli argomenti sono array. Quindi eseguiamo l'iterazione della funzione sull'array, in cui l' elemento Le Rnella funzione rappresentano gli elementi correnti negli array su cui si esegue l'iterazione. Come esempio:

Permettere UN=[1,2,3,4], B=[4,3,2,1] e f(X,y)=X+y. Supponendo che stiamo eseguendo il seguente codice:

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

Abbiamo quindi una dimostrazione di come Eachfunzionano le dichiarazioni. Innanzitutto, quando si lavora con due array, li comprimiamo per formareC=[(1,4),(2,3),(3,2),(4,1)] quindi mappa f(X,y) su ogni coppia, formando il nostro array finale D=[f(1,4),f(2,3),f(3,2),f(4,1)]=[5,5,5,5]

Provalo online!


Come funziona questo codice

Lavorando in modo contro intuitivo al funzionamento di Whispers, partiamo dalle prime due righe:

> Input
> Input

Questo raccoglie i nostri due input, diciamo X e ye li memorizza rispettivamente nelle righe 1 e 2 . Quindi archiviamoX2sulla riga 3 e creare un intervalloUN: =[1...X2]sulla linea 4 . Quindi, passiamo alla sezione

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

La prima cosa eseguita qui è la linea 7 , >> Each 5 4che itera la linea 5 sulla linea 4 . Questo produce l'arrayB: =[io%X|ioUN], dove un'%Bè definito come il modulo diun' e B.

Abbiamo poi eseguiamo linea 8 , >> Each 6 7che itera linea 6 sopraB, producendo un array C: =[(io%X)=y|ioUN].

Per gli input X=5,y=2, noi abbiamo UN=[1,2,3,...,23,24,25], B=[0,1,2,1,0,5,5,...,5,5] e C=[0,0,1,0,0,...,0,0]

Saliamo quindi a

>> L⋅R
>> Each 9 4 8

che è il nostro esempio di una Eachdichiarazione diadica . Qui, la nostra funzione è la linea 9, cioè i >> L⋅Rnostri due arrayUN e C. Moltiplichiamo ogni elemento inUN con l'elemento corrispondente in C, che produce un array, E, in cui ciascun elemento funziona dalla seguente relazione:

Eio={0Cio=0UNioCio=1

Finiamo quindi con un array composto da 0se i moduli inversi di X e y. Per rimuovere il0s, convertiamo questo array in un set ( >> {10}), quindi prendiamo la differenza del set tra questo set e{0}, cedendo, quindi producendo, il nostro risultato finale.


-1

C #, 53 byte (83 con intestazione funzione)

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

Provalo online

Prima prova su codegolf. Probabilmente non è la lingua migliore da usare, né la codifica più efficiente.


5
Rimuovere lo spazio bianco non necessario per salvare circa 10 o più byte
Mr. Xcoder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.