Mengingat n
(jumlah pemain), t
(nilai ambang), dan s
(rahasia), menampilkan n
rahasia yang dihasilkan oleh algoritma Berbagi Rahasia Shamir .
Algoritma
Untuk keperluan tantangan ini, perhitungan akan dilakukan dalam GF (251) (bidang ukuran terbatas 251
, atau dikenal sebagai bilangan bulat mod 251 ). Biasanya, bidang akan dipilih sedemikian rupa sehingga ukurannya adalah yang utama jauh lebih besar daripada n
. Untuk menyederhanakan tantangan, ukuran bidang akan konstan. 251
telah dipilih karena ini merupakan prime terbesar yang dapat diwakili oleh integer 8-bit unsigned.
- Hasilkan
t-1
bilangan bulat acak dalam rentang (inklusif)[0, 250]
. Label ini sebuah 1 melalui sebuah t-1 . - Bangun
t-1
derajat polinomial menggunakans
sebagai nilai konstan dan bilangan bulat acak dari langkah 1 sebagai koefisien dari kekuatanx
: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * a t-1 . - Output
(f(z) mod 251)
untuk masing-masingz
dalam kisaran (inklusif)[1, n]
.
Implementasi Referensi
#!/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)
Verifikasi
Cuplikan Stack berikut dapat digunakan untuk memverifikasi output:
Aturan
s
akan menjadi bilangan bulat non-negatif kurang dari251
, dann
dant
akan menjadi bilangan bulat positif kurang dari251
dan lebih besar dari1
. Selanjutnya, Anda dijamin bahwa inputnya valid (artinyat <= n
).- Input dan output dapat dalam format yang masuk akal, tidak ambigu, dan konsisten.
- Nomor acak harus diambil sampelnya dari distribusi yang seragam - setiap nilai yang mungkin harus memiliki probabilitas yang sama untuk dipilih.
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
sumber
sumber
z
danf(z)
? Jika saya mencetak arrayf(z)
s secara berurutan,z
tersirat oleh indeks.[[1, 5], [2, 2], [3, 9], [4, 14]]
tidak mengandung informasi lebih dari[5, 2, 9, 14]
.Jawaban:
Jelly , 15 byte
Mengharapkan t , n , dan s sebagai argumen command-line. Cobalah online!
Bagaimana itu bekerja
sumber
Mathematica,
5956 byteMembawa tiga argumen dalam urutan t , n , dan s . Membangun 2d-array dengan n baris dan t -1 kolom. Setiap vektor baris j , nomor dari 1 sampai n , mengandung kekuatan j melalui j t -1 . Kemudian vektor koefisien bilangan bulat acak dalam kisaran 0 hingga 250 dibuat dengan nilai t -1. Itu dikalikan matriks dengan array 2d, dan kemudian s ditambahkan elemen-bijaksana dan diambil modul 251 untuk mendapatkan nilai polinomial pada setiap n poin.
sumber
Sum
!Mod[x#+#2&~Fold~RandomInteger[250,#2-1]x+#3/.x->Range@#,251]&
CJam,
2725 byteUji di sini.
sumber
Pyth, 24 byte
Cobalah online!
Pesanan input:
n
s
t
dipisahkan oleh linefeed.sumber
JavaScript, 181 byte
Tidak Disatukan:
Saya tidak tahu bagaimana cara memeriksanya dengan benar, tetapi saya tahu bahwa itu sulit untuk mendapatkan JS untuk memetakan di array baru karena tampaknya
.map
melewatkan nilai yang tidak ditentukan. Jika ada yang melihat cara untuk meningkatkan, atau kekurangan, jangan ragu untuk memberi tahu saya.sumber
(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
, yang tampaknya salah. Kode Anda juga tampaknya mengasumsikan pengindeksan berbasis 1.[...Array()]
sedikit lebih pendek darifiil()
. Juga, dua baris terakhir dapat dikurangi menjadireturn _.map(f);
C #,
138134 byteC # lambda di mana input berada
int
dan output adalahIEnumerable<double>
. Anda dapat mencoba kode saya di .NetFiddle .Saya tidak 100% yakin tentang validitas algoritma saya, mohon komentar jika saya salah mengerti sesuatu.
4 byte disimpan dengan trik @ raggy .
sumber
MATL ,
2019 byteAgar input
t
,s
,n
.Cobalah online!
Penjelasan
sumber
Julia, 48 byte
Cobalah online!
sumber
JavaScript (ES6), 116 byte
Saya ingin berpikir ini adalah salah satu kasus yang jarang terjadi di mana
reduce
ketukanmap
.sumber
Python 3 dengan NumPy , 103 byte
Jujur saya bisa mengatakan bahwa saya tidak pernah diharapkan untuk menggunakan NumPy untuk kode golf ...
Fungsi anonim yang mengambil input melalui argumen dan mengembalikan daftar.
Bagaimana itu bekerja
Cobalah di Ideone
sumber
J ,
3230 byteMengambil daftar dengan nilai n , t , dan s .
Disimpan 2 byte dengan menggunakan ganti pada indeks 0 ide dari solusi @ Dennis .
Penjelasan
sumber
Java 8, 224 byte:
Ekspresi Java 8 lambda. Output array integer yang dipisahkan koma, dan bekerja dengan sempurna sampai nilai-nilai dalam array output mencapai di luar kisaran Java
long
, atau 64-bit integer yang ditandatangani, tipe data, yang-200
menjadi output ke dalam array.Cobalah secara Online! (Ideone)
sumber