Dado n
(el número de jugadores), t
(el valor del umbral) y s
(el secreto), n
generan los secretos generados por el algoritmo de intercambio secreto de Shamir .
El algoritmo
Para los propósitos de este desafío, los cálculos se realizarán en GF (251) (el campo finito de tamaño 251
, también conocido como el número entero mod 251 ). Normalmente, el campo se elegiría de tal manera que su tamaño sea un primo mucho mayor que n
. Para simplificar el desafío, el tamaño del campo será constante. 251
ha sido elegido porque es el primo más grande representable por un entero sin signo de 8 bits.
- Genere
t-1
enteros aleatorios en el rango (inclusive)[0, 250]
. Etiquetar estos un 1 a través de un t-1 . - Construya un
t-1
polinomio de grado th usandos
como valor constante y los enteros aleatorios del paso 1 como los coeficientes de las potencias dex
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * a t-1 . - Salida
(f(z) mod 251)
para cada unoz
en el rango (incluido)[1, n]
.
Implementación de referencia
#!/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)
Verificación
El siguiente fragmento de pila se puede utilizar para verificar salidas:
Reglas
s
será un número entero no negativo menor que251
,n
yt
será un número entero positivo menor251
y mayor que1
. Además, tiene la garantía de que las entradas son válidas (significadot <= n
).- La entrada y la salida pueden estar en cualquier formato razonable, inequívoco y consistente.
- Los números aleatorios se tomarán de una distribución uniforme: cada valor posible debe tener la misma probabilidad de ser elegido.
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
fuente
fuente
z
yf(z)
? Si imprimo una matriz def(z)
s en orden,z
está implícito en el índice.[[1, 5], [2, 2], [3, 9], [4, 14]]
no contiene más información que[5, 2, 9, 14]
.Respuestas:
Jalea , 15 bytes
Espera t , n , y s como argumentos de línea de comandos. Pruébalo en línea!
Cómo funciona
fuente
Mathematica,
5956 bytesToma tres argumentos en el orden t , n y s . Construye una matriz 2d con n filas y t -1 columnas. Cada fila vector j , numerados del 1 al n , contiene los poderes de j thru j t -1 . Luego, se crea un vector de coeficientes enteros aleatorios en el rango de 0 a 250 con valores t -1. Eso se multiplica por la matriz con la matriz 2d, y luego se agrega s por elemento y se toma el módulo 251 para obtener el valor del polinomio en cada uno de los n puntos.
fuente
Sum
!Mod[x#+#2&~Fold~RandomInteger[250,#2-1]x+#3/.x->Range@#,251]&
CJam,
2725 bytesPruébalo aquí.
fuente
Pyth, 24 bytes
Pruébalo en línea!
Orden de entrada:
n
s
t
separado por salto de línea.fuente
JavaScript, 181 bytes
Sin golf:
No sé cómo verificarlo correctamente, pero sí sé que fue difícil hacer que JS mapee en una nueva matriz, ya que aparentemente
.map
omite valores indefinidos. Si alguien ve alguna forma de mejorar, o defectos, no dude en hacérmelo saber.fuente
(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
, lo que parece incorrecto. Su código también parece estar asumiendo una indexación basada en 1.[...Array()]
es un poco más corto quefiil()
. Además, las dos últimas líneas se pueden reducir areturn _.map(f);
C #,
138134 bytesC # lambda donde están las entradas
int
y la salida es unIEnumerable<double>
. Puedes probar mi código en .NetFiddle .No estoy 100% seguro de la validez de mi algoritmo, comente si entendí mal algo.
4 bytes guardados con el truco de @ raggy .
fuente
MATL ,
2019 bytesOrden de entrada es
t
,s
,n
.Pruébalo en línea!
Explicación
fuente
Julia, 48 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 116 bytes
Me gustaría pensar que este es uno de los raros casos en los que
reduce
latemap
.fuente
Python 3 con NumPy , 103 bytes
Puedo decir honestamente que nunca esperé usar NumPy para el golf de código ...
Una función anónima que toma datos a través de argumentos y devuelve una lista
Cómo funciona
Pruébalo en Ideone
fuente
J ,
3230 bytesToma una lista con los valores n , t y s .
Ahorró 2 bytes usando la idea de reemplazar en el índice 0 de la solución de @ Dennis .
Explicación
fuente
Java 8, 224 bytes:
Una expresión lambda de Java 8. Emite una matriz de enteros separados por comas y funciona perfectamente hasta que los valores en la matriz de salida alcanzan más allá del rango del
long
tipo de datos de Java , o entero de 64 bits, sobre el cual-200
se emite en la matriz.¡Pruébelo en línea! (Ideone)
fuente