Étant donné n
(le nombre de joueurs), t
(la valeur seuil) et s
(le secret), sortez les n
secrets générés par l'algorithme de partage de secrets de Shamir .
L'algorithme
Aux fins de ce défi, les calculs seront effectués en GF (251) (le champ fini de taille 251
, autrement connu comme les entiers mod 251 ). Normalement, le champ serait choisi de telle sorte que sa taille soit un nombre premier bien supérieur à n
. Pour simplifier le défi, la taille du champ sera constante. 251
a été choisi car il s'agit du plus grand nombre premier représentable par un entier non signé 8 bits.
- Générez
t-1
des entiers aléatoires dans la plage (inclusive)[0, 250]
. Marquez ces un 1 par un t-1 . - Construire un
t-1
polynôme de th degré en utilisants
comme valeur constante et les entiers aléatoires de l'étape 1 comme coefficients des puissances dex
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * un t-1 . - Sortie
(f(z) mod 251)
pour chacunz
dans la plage (incluse)[1, n]
.
Implémentation de référence
#!/usr/bin/env python
from __future__ import print_function
import random
import sys
# Shamir's Secret Sharing algorithm
# Input is taken on the command line, in the format "python shamir.py n t s"
n, t, s = [int(x) for x in sys.argv[1:4]]
if t > n:
print("Error: t must be less than or equal to n")
exit()
if n not in range(2, 251):
print("Error: n must be a positive integer less than 251")
exit()
if t not in range(2, 251):
print("Error: t must be a positive integer less than 251")
exit()
if s not in range(251):
print("Error: s must be a non-negative integer less than 251")
exit()
p = 251
a = [random.randrange(0, 251) for x in range(t-1)]
def f(x):
return s + sum(c*x**(i+1) for i,c in enumerate(a))
# Outputting the polynomial is for explanatory purposes only, and should not be included
# in the output for the challenge
print("f(x) = {0} + {1}".format(s, ' + '.join('{0}*x^{1}'.format(c, i+1) for i,c in enumerate(a))))
for z in range(1, n+1):
print(f(z) % p)
Vérification
L'extrait de pile suivant peut être utilisé pour vérifier les sorties:
Règles
s
sera un entier non négatif inférieur à251
, etn
ett
sera un entier positif inférieur251
et supérieur à1
. De plus, vous êtes assuré que les entrées sont valides (ce qui signifiet <= n
).- L'entrée et la sortie peuvent être dans n'importe quel format raisonnable, sans ambiguïté et cohérent.
- Les nombres aléatoires doivent être échantillonnés à partir d'une distribution uniforme - chaque valeur possible devrait avoir une probabilité égale d'être choisie.
code-golf
number-theory
random
cryptography
polynomials
code-golf
number
code-golf
math
number
sequence
code-golf
quine
code-generation
code-golf
arithmetic
set-theory
code-golf
sequence
code-golf
code-golf
string
math
fastest-code
optimization
code-golf
code-golf
internet
stack-exchange-api
code-golf
array-manipulation
code-golf
string
internet
string
code-challenge
internet
test-battery
code-golf
math
pi
code-golf
arithmetic
primes
code-golf
array-manipulation
code-golf
string
code-golf
string
palindrome
code-golf
sequence
number-theory
fastest-algorithm
code-golf
math
number
base-conversion
code-golf
number-theory
sorting
subsequence
search
code-golf
permutations
code-challenge
popularity-contest
code-generation
Mego
la source
la source
z
etf(z)
? Si j'imprime un tableau def(z)
s dans l'ordre,z
est impliqué par index.[[1, 5], [2, 2], [3, 9], [4, 14]]
ne contient pas plus d'informations que[5, 2, 9, 14]
.Réponses:
Gelée , 15 octets
Attend t , n et s comme arguments de ligne de commande. Essayez-le en ligne!
Comment ça fonctionne
la source
Mathematica,
5956 octetsPrend trois arguments dans l'ordre t , n et s . Construit un tableau 2D avec n lignes et t -1 colonnes. Chaque vecteur ligne j , numéroté de 1 à n , contient les puissances de j à j t -1 . Ensuite, un vecteur de coefficients entiers aléatoires compris entre 0 et 250 est créé avec des valeurs t -1. Cela est multiplié par matrice avec le tableau 2d, puis s est ajouté par élément et pris le module 251 pour obtenir la valeur du polynôme en chacun des n points.
la source
Sum
!Mod[x#+#2&~Fold~RandomInteger[250,#2-1]x+#3/.x->Range@#,251]&
CJam,
2725 octetsTestez-le ici.
la source
Pyth, 24 octets
Essayez-le en ligne!
Ordre d'entrée:
n
s
t
séparé par un saut de ligne.la source
JavaScript, 181 octets
Non golfé:
Je ne sais pas comment le vérifier correctement, mais je sais que c'était difficile de faire en sorte que JS mappe sur un nouveau tableau car il
.map
saute apparemment des valeurs non définies. Si quelqu'un voit des moyens de s'améliorer ou des défauts, n'hésitez pas à me le faire savoir.la source
(n,t,s,A=f=>Array(t-1).fill(0).map(f),r=A($=>Math.random()*251))=> A((l,i,_,p=0)=>(r.map((k,c)=>p+=k*Math.pow(i,c)),s+p))
n
, ce qui semble faux. Votre code semble également supposer une indexation basée sur 1.[...Array()]
est légèrement plus courte quefiil()
. De plus, les deux dernières lignes peuvent être réduites àreturn _.map(f);
C #,
138134 octetsC # lambda où les entrées sont
int
et la sortie est unIEnumerable<double>
. Vous pouvez essayer mon code sur .NetFiddle .Je ne suis pas sûr à 100% de la validité de mon algorithme, veuillez commenter si j'ai mal compris quelque chose.
4 octets enregistrés avec le truc de @ raggy .
la source
MATL ,
2019 octetsCommande d' entrée est
t
,s
,n
.Essayez-le en ligne!
Explication
la source
Julia, 48 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 116 octets
J'aimerais penser que c'est l'un des rares cas où les
reduce
battementsmap
.la source
Python 3 avec NumPy , 103 octets
Je peux honnêtement dire que je ne m'attendais pas à utiliser NumPy pour le golf de code ...
Une fonction anonyme qui prend une entrée via un argument et renvoie une liste.
Comment ça fonctionne
Essayez-le sur Ideone
la source
J ,
3230 octetsPrend une liste avec les valeurs n , t et s .
Enregistrement de 2 octets en utilisant l' idée de remplacement à l'index 0 de la solution de @ Dennis .
Explication
la source
Java 8, 224 octets:
Une expression lambda Java 8. Génère un tableau d'entiers séparés par des virgules et fonctionne parfaitement jusqu'à ce que les valeurs du tableau de sortie dépassent la plage du
long
type de données Java ou entier signé 64 bits, sur lequel-200
est sorti dans le tableau.Essayez-le en ligne! (Ideone)
la source