Biorąc pod uwagę n
(liczbę graczy), t
(wartość progową) i s
(sekret), n
generuj sekrety generowane przez algorytm Shamir's Secret Sharing .
Algorytm
Na potrzeby tego wyzwania obliczenia zostaną wykonane w GF (251) (skończone pole wielkości 251
, znane również jako liczby całkowite mod 251 ). Zazwyczaj pole jest wybierane w taki sposób, że jego wielkość jest liczbą pierwszą znacznie większą niż n
. Aby uprościć wyzwanie, wielkość pola będzie stała. 251
został wybrany, ponieważ jest największą liczbą pierwszą reprezentowaną przez 8-bitową liczbę całkowitą bez znaku.
- Generuj
t-1
losowe liczby całkowite z zakresu (włącznie)[0, 250]
. Oznacz je do 1 za pomocą t-1 . - Skonstruować
t-1
algebraicznej p użycius
jako wartość stałą i liczb całkowitych z etapu 1, tak jak współczynniki uprawnieńx
: f (x) = y + x * a 1 + x 2 * a 2 + ... + X t- 1 * a t-1 . - Wyjście
(f(z) mod 251)
dla każdegoz
z zakresu (włącznie)[1, n]
.
Wdrożenie referencyjne
#!/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)
Weryfikacja
Do weryfikacji wyników można użyć następującego fragmentu stosu:
Zasady
s
będzie nieujemną liczbę całkowitą, mniejszą251
in
it
będzie całkowite dodatnie mniej niż251
i więcej niż1
. Ponadto masz gwarancję, że dane wejściowe są prawidłowe (znaczeniet <= n
).- Dane wejściowe i wyjściowe mogą mieć dowolny rozsądny, jednoznaczny i spójny format.
- Próbki liczb losowych należy próbkować z równomiernego rozkładu - każda możliwa wartość powinna mieć jednakowe prawdopodobieństwo wyboru.
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
źródło
źródło
z
if(z)
? Jeśli wydrukuję tablicęf(z)
s po kolei,z
wynika to z indeksu.[[1, 5], [2, 2], [3, 9], [4, 14]]
nie zawiera więcej informacji niż[5, 2, 9, 14]
.Odpowiedzi:
Galaretka , 15 bajtów
Oczekuje , że t , n i s jako argumenty wiersza polecenia. Wypróbuj online!
Jak to działa
źródło
Mathematica,
5956 bajtówPrzyjmuje trzy argumenty w kolejności t , n i s . Konstruuje tablicę 2d z n rzędami i t -1 kolumnami. Każdy wektor wiersza j , ponumerowany od 1 do n , zawiera moce od j do j t -1 . Następnie tworzony jest wektor losowych współczynników całkowitych z zakresu od 0 do 250 z wartościami t -1. To jest mnożone przez macierz z macierzą 2d, a następnie s jest dodawane elementarnie i pobierane moduł 251, aby uzyskać wartość wielomianu w każdym z n punktów.
źródło
Sum
!Mod[x#+#2&~Fold~RandomInteger[250,#2-1]x+#3/.x->Range@#,251]&
CJam,
2725 bajtówSprawdź to tutaj.
źródło
Pyth, 24 bajty
Wypróbuj online!
Kolejność wprowadzania:
n
s
t
oddzielone przez podawanie liniowe.źródło
JavaScript, 181 bajtów
Nie golfowany:
Nie wiem, jak poprawnie to sprawdzić, ale wiem, że JS miał problem z mapowaniem nowej tablicy, ponieważ najwyraźniej
.map
pomija niezdefiniowane wartości. Jeśli ktoś widzi jakieś sposoby poprawy lub wady, nie wahaj się dać mi znać.źródło
(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
, co wydaje się złe. Wydaje się, że twój kod również indeksuje w oparciu o 1.[...Array()]
jest nieco krótszy niżfiil()
. Ponadto ostatnie dwa wiersze można zmniejszyć doreturn _.map(f);
C #,
138134 bajtówC # lambda, gdzie są dane wejściowe,
int
a dane wyjściowe toIEnumerable<double>
. Możesz wypróbować mój kod na .NetFiddle .Nie jestem w 100% pewien co do poprawności mojego algorytmu, proszę o komentarz, jeśli coś źle zrozumiem.
4 bajty zapisane za pomocą sztuczki @ raggy .
źródło
MATL ,
2019 bajtówKolejność wejście jest
t
,s
,n
.Wypróbuj online!
Wyjaśnienie
źródło
Julia, 48 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 116 bajtów
Chciałbym pomyśleć, że to jeden z rzadkich przypadków, w których
reduce
bijemap
.źródło
Python 3 z NumPy , 103 bajty
Mogę szczerze powiedzieć, że nigdy nie spodziewałem się używać NumPy do golfa kodowego ...
Anonimowa funkcja, która pobiera dane wejściowe za pomocą argumentu i zwraca listę.
Jak to działa
Wypróbuj na Ideone
źródło
J ,
3230 bajtówPobiera listę z wartościami n , t oraz s .
Zaoszczędzono 2 bajty, używając idei replace at index 0 z rozwiązania @ Dennis .
Wyjaśnienie
źródło
Java 8, 224 bajty:
Wyrażenie lambda Java 8. Zwraca tablicę liczb całkowitych oddzielonych przecinkami i działa idealnie, dopóki wartości w tablicy wyjściowej nie przekroczą zakresu typu danych Java
long
lub 64-bitowej liczby całkowitej ze znakiem, na podstawie którego-200
dane wyjściowe są wysyłane do tablicy.Wypróbuj online! (Ideone)
źródło