Calculez le module inverse

18

La tâche:

Affiche une valeur pour x, où a mod x = bpour deux valeurs données a,b.

supposition

  • aet bsera toujours des entiers positifs
  • Il n'y aura pas toujours de solution pour x
  • Si plusieurs solutions existent, sortez au moins l'une d'entre elles.
  • S'il n'y a pas de solutions, ne rien produire ou indiquer qu'aucune solution n'existe.
  • Les fonctions intégrées sont autorisées (pas aussi amusantes que d'autres approches mathématiques)
  • Les sorties sont toujours des entiers

Exemples

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

C'est le , donc les octets les plus bas gagnent.

Graviton
la source
Peut-il commettre une erreur si aucune solution n'est trouvée?
clap
@ConfusedMr_C Techniquement, cela n'indique aucune solution, alors oui.
Graviton

Réponses:

11

JavaScript , 28 27 26 24 23 octets

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

Essayez-le en ligne!

false indique aucune solution.

-1 merci @Arnauld

eush77
la source
Joliment fait et joliment golfé.
Shaggy
Donc, pour l'appeler, vous devez donner un nom à la fonction externe, par exemple f=..., puis appeler f(8)(3)? Cela semble un peu tricheur? La façon normale d'appeler une fonction serait f(8,3), ce qui allongerait la définition de votre fonction?
Steve Bennett
3
@SteveBennett Certes, la définition est curry , ce qui signifie qu'elle doit être appelée comme (8)(3), mais il y a un consensus sur PPCG qui est autorisé . Vous n'êtes pas obligé de lui donner un nom cependant.
eush77
1
@SteveBennett C'est amusant de voir comment vous pensez que 26 vs -15 est tout sauf un consensus clair. Bonne chance pour essayer de contester.
eush77
1
@SteveBennett comment 55 à 1 est un faible consensus?
Cyoce
6

MATL , 6 octets

tQ:\=f

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

Tenez compte des entrées 8, à 2titre d'exemple.

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]
Luis Mendo
la source
3

Groovy, 48 octets (en utilisant intégré):

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

Eval.me(...+"g") - Appose "g" à l'entrée, ce qui en fait un BigInteger.

modInverse(...) - Effectue l'opération modulo inverse.


Java 8, 70 octets

{a,b->return BigInteger.valueOf(a).modInverse(BigInteger.valueOf(b));}
Urne de poulpe magique
la source
3

R , 33 28 octets

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

Essayez-le en ligne!

-4 octets grâce à Jarko Dubbeldam.

-1 octet grâce à Giuseppe.

Renvoie NAs'il n'y a pas de solution. TIO n'a pas la bibliothèque pryr installée, donc le code de ce lien utilise à la function(a,b)place.

Nitrodon
la source
pryr::f(which(a%%1:(a+1)==b)) est de 4 octets plus court.
JAD
vous pouvez également supprimer un autre octet à l'aide de match(b,a%%1:(a+1)), qui renvoie NAune valeur manquante.
Giuseppe
1

Gelée , 11 10 octets

³%_⁴
r‘ÇÐḟ

Un programme complet prenant les deux entiers positifs, aetb , et imprimant une liste des solutions entières entre min(a,b)+1et max(a,b)+1inclus.

Essayez-le en ligne!

Jonathan Allan
la source
1

Mathematica 36 octets

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

Contribution:

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

Production:

{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}
Kelly Lowder
la source
Lorsque vous utilisez ces opérateurs ASCII étendus sous une forme binaire, ils ont besoin d'un espace devant lorsqu'ils sont définis, sinon l'analyseur génère une erreur. Il faudrait donc que ce soit le cas a_ ±b_. Mais il est plus court à utiliser Casesau lieu d' Selectune fonction sans nom de toute façon:Cases[Range[9#],x_/;#~Mod~x==#2]&
Martin Ender
1

Haskell , 33 octets

Se bloque avec code.hs: out of memory (requested ??? bytes)s'il n'y a pas de solution (expire sur TIO avant cela):

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

Essayez-le en ligne!

Merci à Ørjan Johansen d' avoir repéré une erreur!

ბიმო
la source
Cela donne de mauvaises réponses pour les cas de test où se bdivise a.
Ørjan Johansen
1

C # (compilateur Mono C #) , 57 56 26 octets

Réponse de Port of Rod en Python. Merci à WW pour -1 octet.

ENORME merci à Kevin Cruijssen pour -30 octets.

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

Essayez-le en ligne!

Epicness
la source
1
Bienvenue sur le site! Il semble que vous puissiez supprimer l'espace après return.
Post Rock Garf Hunter
Bienvenue chez PPCG! Pour les réponses C # non récursives, il est toujours préférable et le plus court d'utiliser une fonction lambda ( i=>{/*code here*/}). Dans ce cas cependant, puisque vous avez 2 entrées, il peut s'agir d'une fonction lambda currying pour enregistrer un octet supplémentaire ( a=>b=>{/*code here*/}au lieu de (a,b)=>{/*code here*/}). En outre, vous pouvez supprimer les parenthèses autour de vos vérifications if. Au total, sans changer aucune de vos fonctionnalités, cela devient a=>b=>a-b>b?a-b:a==b?a+1:0 26 octets
Kevin Cruijssen
De plus, si vous ne l'avez pas encore vu, les astuces pour jouer au golf dans <toutes les langues> et les astuces pour jouer au golf en C # peuvent être intéressantes à lire. Profitez de votre séjour! :)
Kevin Cruijssen
Merci à tous pour les conseils, je les garderai à l'esprit lors du golf à l'avenir.
Epicness
0

Mathematica, 28 octets

Which[#>2#2,#-#2,#==#2,#+1]&
alephalpha
la source
0

PHP> = 7.1, 51 octets

for([,$a,$b]=$argv;++$x<2*$a;)$a%$x!=$b?:print$x._;

Version en ligne

Jörg Hülsermann
la source
0

Axiome, 147 128 octets

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

dé-golfer et tester

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

Cela trouverait toute la solution même la solution d'ensemble infini ...

RosLuP
la source
0

Pip , 9 octets

a%,a+2@?b

Prend les deux nombres comme arguments de ligne de commande. Génère la solution la plus petite, ou nulle si aucune solution n'existe. Essayez-le en ligne!

Explication

           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)

Par exemple, avec l'entrée de 8et 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'index basé sur 0 de la première occurrence de 2dans cette liste est 3, ce qui est notre solution.

DLosc
la source
0

J , 14 octets

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

Essayez-le en ligne!

Traduction de la solution Python 2 Rod .

Comment ça fonctionne

Les rares cas où un code J peut être directement traduit en Python.

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

Japt , 13 octets

UµV ?U>V©U:ÒV

Essayez-le en ligne!

Traduction de la solution JS d' eush77 .

Le code est juste (U-=V)?U>V&&U:-~Vlorsqu'il est transpilé en JS, où Uet Vsont les deux valeurs d'entrée.

Bubbler
la source
0

Japt , 7 octets

(Finalement) Sort undefineds'il n'y a pas de solution.

@%X¥V}a

Essayez-le ici

Hirsute
la source
0

ORK , 566 octets

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

Essayez-le en ligne!

O bjects R K ool. Heureusement, cependant, je n'avais pas besoin d'en utiliser (à part ceux intégrés) pour cette tâche.

JosiahRyanW
la source
0

F #, 40 octets

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

Essayez-le en ligne!

Assez simple. Lance un System.Collections.Generic.KeyNotFoundExceptionsi aucune solution ne peut être trouvée.

Vous pouvez également le modifier en Seq.tryFind, qui renverra un int option, avec Nonesi aucune solution n'a été trouvée.

Ciaran_McCarthy
la source
0

> <> , 21 octets

Même astuce que la plupart des solutions publiées. Tout d'abord, nous préparons toutes les valeurs nécessaires sur la pile, puis vérifions les comparaisons.

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

Essayez-le en ligne!

PidgeyUsedGust
la source
0

Whispers v2 , 128 octets

> 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

Essayez-le en ligne!

Renvoie un ensemble de toutes les solutions possibles et l'ensemble vide (c'est-à-dire ) lorsqu'aucune solution n'existe.

Comment ça fonctionne

Sans surprise, il fonctionne presque de manière identique à la plupart des autres réponses: il génère une liste de nombres et vérifie chacun pour module inverse avec l'argument.

Si vous connaissez le fonctionnement de la structure du programme Whispers, n'hésitez pas à passer à la ligne horizontale. Sinon: essentiellement, Whispers fonctionne sur un système de référence ligne par ligne, en commençant par la ligne finale. Chaque ligne est classée comme l'une des deux options. Soit c'est une ligne nilade , soit c'est une ligne opérateur .

Les lignes Nilad commencent par >, comme > Inputou > {0}et retournent la valeur exacte représentée sur cette ligne, c'est-à-dire > {0}renvoie l'ensemble{0}. > Inputrenvoie la ligne suivante de STDIN, évaluée si possible.

Les lignes d'opérateur commencent par >>, comme >> 1²ou >> (3]et indiquent l'exécution d'un opérateur sur une ou plusieurs valeurs. Ici, les nombres utilisés ne font pas référence à ces nombres explicites, ils font plutôt référence à la valeur sur cette ligne. Par exemple, ²la commande carré (nn2), >> 1²ne renvoie donc pas la valeur12, au lieu de cela, il renvoie le carré de la ligne 1 , qui, dans ce cas, est la première entrée.

Habituellement, les lignes d'opérateur fonctionnent uniquement en utilisant des nombres comme références, mais vous avez peut-être remarqué les lignes >> L=2et >> L⋅R. Ces deux valeurs, Let R, sont utilisées conjointement avec des Eachinstructions. EachLes instructions fonctionnent en prenant deux ou trois arguments, à nouveau comme références numériques. Le premier argument (par exemple 5) est une référence à une ligne d'opérateur utilisée une fonction, et le reste des arguments sont des tableaux. Nous itérons ensuite la fonction sur le tableau, où le Let Rdans la fonction représentent le ou les éléments actuels dans les tableaux en cours d'itération. Par exemple:

Laisser UNE=[1,2,3,4], B=[4,3,2,1] et F(X,y)=X+y. En supposant que nous exécutons le code suivant:

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

Nous obtenons ensuite une démonstration du fonctionnement des Eachinstructions. Tout d'abord, lorsque vous travaillez avec deux tableaux, nous les compressons pour formerC=[(1,4),(2,3),(3,2),(4,1)] puis cartographier F(X,y) sur chaque paire, formant notre matrice finale =[F(1,4),F(2,3),F(3,2),F(4,1)]=[5,5,5,5]

Essayez-le en ligne!


Comment ce code fonctionne

En travaillant de manière contre-intuitive au fonctionnement de Whispers, nous partons des deux premières lignes:

> Input
> Input

Cela recueille nos deux entrées, disons X et yet les stocke dans les lignes 1 et 2 respectivement. Nous stockons ensuiteX2sur la ligne 3 et créer une gammeUNE: =[1...X2]sur la ligne 4 . Ensuite, nous sautons à la section

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

La première chose exécutée ici est la ligne 7 , >> Each 5 4qui itère ligne 5 sur la ligne 4 . Cela donne le tableauB: =[je%X|jeUNE], où une%best défini comme le module deune et b.

Nous exécutons ensuite la ligne 8 , >> Each 6 7qui itère ligne 6 surB, donnant un tableau C: =[(je%X)=y|jeUNE].

Pour les entrées X=5,y=2, on a 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.

caird coinheringaahing
la source
-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.

Alex
la source
5
Remove the unnecessary whitespace to save about 10 or more bytes
Mr. Xcoder