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.


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


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]



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));}

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.


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

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}

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

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!


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

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


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.







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.


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.




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!


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.


-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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.