Ausgehend von n
(der Anzahl der Spieler), t
(dem Schwellenwert) und s
(dem Geheimnis) werden die n
Geheimnisse ausgegeben, die durch Shamirs Secret-Sharing-Algorithmus generiert wurden .
Der Algorithmus
Für die Zwecke dieser Herausforderung werden die Berechnungen in GF (251) (dem endlichen Feld der Größe 251
, auch bekannt als Ganzzahlen mod 251 ) durchgeführt. Normalerweise würde das Feld so gewählt, dass seine Größe eine Primzahl ist, die viel größer ist als n
. Um die Herausforderung zu vereinfachen, ist die Feldgröße konstant. 251
wurde gewählt, weil es die größte durch eine 8-Bit-Ganzzahl ohne Vorzeichen darstellbare Primzahl ist.
- Generieren Sie
t-1
zufällige Ganzzahlen im Bereich (einschließlich)[0, 250]
. Beschriften Sie diese ein 1 durch einen t-1 . - Konstruiere ein
t-1
Polynom des Grades mits
dem konstanten Wert und den Zufallszahlen aus Schritt 1 als Koeffizienten der Potenzen vonx
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * a t-1 . - Ausgabe
(f(z) mod 251)
jeweilsz
im (inklusive) Bereich[1, n]
.
Referenzimplementierung
#!/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)
Nachprüfung
Das folgende Stack-Snippet kann zum Überprüfen von Ausgaben verwendet werden:
Regeln
s
wird weniger eine nicht negative ganze Zahl ist als251
undn
undt
wird positive ganze Zahlen kleiner als251
und größer als1
. Darüber hinaus ist gewährleistet, dass die Eingaben gültig sind (Bedeutungt <= n
).- Die Ein- und Ausgabe kann in jedem vernünftigen, eindeutigen und konsistenten Format erfolgen.
- Zufallszahlen sind aus einer Gleichverteilung abzutasten - jeder mögliche Wert sollte die gleiche Wahrscheinlichkeit haben, gewählt zu werden.
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
quelle
quelle
z
undf(z)
? Wenn ich ein Array vonf(z)
s in der richtigen Reihenfolgez
drucke , wird dies durch den Index impliziert.[[1, 5], [2, 2], [3, 9], [4, 14]]
enthält nicht mehr Informationen als[5, 2, 9, 14]
.Antworten:
Gelee , 15 Bytes
Erwartet t , n und s als Befehlszeilenargumente. Probieren Sie es online!
Wie es funktioniert
quelle
Mathematica,
5956 BytesNimmt drei Argumente in der Reihenfolge t , n und s auf . Konstruiert ein 2d-Array mit n Zeilen und t -1 Spalten. Jeder von 1 bis n nummerierte Zeilenvektor j enthält die Potenzen von j bis j t & supmin; ¹ . Dann wird ein Vektor von zufälligen ganzzahligen Koeffizienten im Bereich von 0 bis 250 mit t & supmin; ¹ Werten erzeugt. Dies wird mit dem 2d-Array matrixmultipliziert und dann wird s elementweise addiert und das Modul 251 genommen, um den Wert des Polynoms an jedem der n Punkte zu erhalten.
quelle
Sum
!Mod[x#+#2&~Fold~RandomInteger[250,#2-1]x+#3/.x->Range@#,251]&
CJam,
2725 BytesTeste es hier.
quelle
Pyth, 24 Bytes
Probieren Sie es online!
Eingabereihenfolge:
n
s
t
durch Zeilenvorschub getrennt.quelle
JavaScript, 181 Bytes
Ungolfed:
Ich weiß nicht, wie man es richtig überprüft, aber ich weiß, dass es ein Problem war, JS dazu zu bringen, ein neues Array zuzuordnen, da anscheinend
.map
undefinierte Werte übersprungen werden. Wenn jemand Verbesserungsmöglichkeiten oder Mängel sieht, zögern Sie nicht, mich zu informieren.quelle
(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
, was falsch zu sein scheint. Ihr Code scheint auch eine 1-basierte Indizierung vorauszusetzen.[...Array()]
ist etwas kürzer alsfiil()
. Außerdem können die letzten beiden Zeilen aufreturn _.map(f);
C #,
138134 BytesC # Lambda, wo Eingänge
int
und Ausgang sind, ist einIEnumerable<double>
. Sie können meinen Code auf .NetFiddle ausprobieren .Ich bin mir über die Gültigkeit meines Algorithmus nicht 100% sicher. Bitte kommentieren Sie, wenn ich etwas falsch verstanden habe.
4 Bytes mit @ raggys Trick gespeichert .
quelle
MATL ,
20 bis19 BytesEingabereihenfolge ist
t
,s
,n
.Probieren Sie es online!
Erläuterung
quelle
Julia, 48 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 116 Byte
Ich würde gerne denken, dass dies einer der seltenen Fälle ist, in denen
reduce
Beats auftretenmap
.quelle
Python 3 mit NumPy , 103 Bytes
Ich kann ehrlich sagen, dass ich nie damit gerechnet hätte, NumPy für Code Golf zu verwenden ...
Eine anonyme Funktion, die Eingaben über Argumente entgegennimmt und eine Liste zurückgibt.
Wie es funktioniert
Probieren Sie es auf Ideone
quelle
J ,
32-30BytesNimmt eine Liste mit den Werten n , t und s auf .
Durch Verwendung der Idee " Ersetzen bei Index 0" aus der @ Dennis- Lösung wurden 2 Byte eingespart .
Erläuterung
quelle
Java 8, 224 Bytes:
Ein Java-8-Lambda-Ausdruck. Gibt ein durch Kommas getrenntes ganzzahliges Array aus und funktioniert einwandfrei, bis die Werte im Ausgabearray außerhalb des Bereichs des Java liegen
long
Datentyps 64-Bit Integer mit Vorzeichen) überschreiten, der-200
in das Array ausgegeben wird.Probieren Sie es online! (Ideone)
quelle