यह देखते हुए n(खिलाड़ियों की संख्या), t(थ्रेशोल्ड वैल्यू), और s(सीक्रेट), शमीर के सीक्रेट शेयर एल्गोरिथ्मn द्वारा उत्पन्न रहस्यों को आउटपुट करता है ।
एल्गोरिथ्म
इस चुनौती के प्रयोजनों के लिए, गणना GF (251) (आकार के परिमित क्षेत्र 251, अन्यथा पूर्णांक मॉड 251 के रूप में जाना जाता है ) में की जाएगी। आमतौर पर, फ़ील्ड को इस तरह चुना जाएगा कि उसका आकार एक अभाज्य से अधिक हो n। चुनौती को सरल बनाने के लिए, क्षेत्र का आकार स्थिर रहेगा। 251चुना गया है क्योंकि यह 8-बिट अहस्ताक्षरित पूर्णांक द्वारा सबसे बड़ा अभाज्य अभाज्य है।
- उत्पन्न
t-1(सम्मिलित) रेंज में यादृच्छिक पूर्णांकों[0, 250]। इन लेबल करें एक 1 के माध्यम से एक टी 1 । - लगातार मूल्य और चरण 1 से यादृच्छिक पूर्णांकों के रूप में
t-1उपयोग कर एक वें डिग्री बहुपद का निर्माण करें :sशक्तियों की गुणांक के रूप मेंx: f (x) = s + x * a 1 + x 2 * a 2 + ... + x t- 1 * एक टी -1 । - (सम्मिलित) श्रेणी में
(f(z) mod 251)प्रत्येक के लिए आउटपुट ।z[1, n]
संदर्भ कार्यान्वयन
#!/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)
सत्यापन
आउटपुट को सत्यापित करने के लिए निम्नलिखित स्टैक स्निपेट का उपयोग किया जा सकता है:
नियम
sएक गैर नकारात्मक पूर्णांक से कम होगी251, औरnऔरtकी तुलना में धनात्मक पूर्णांक कम होगा251और अधिक से अधिक1। इसके अलावा, आप गारंटी देते हैं कि इनपुट मान्य हैं (अर्थt <= n)।- इनपुट और आउटपुट किसी भी उचित, स्पष्ट और सुसंगत प्रारूप में हो सकते हैं।
- यादृच्छिक संख्या को एक समान वितरण से नमूना किया जाना है - प्रत्येक संभावित मूल्य में चुने जाने की समान संभावना होनी चाहिए।
zऔरf(z)? यदि मैंf(z)क्रम में एस की एक सरणी प्रिंट करता हूं ,zतो सूचकांक द्वारा निहित है।[[1, 5], [2, 2], [3, 9], [4, 14]]से अधिक जानकारी नहीं है[5, 2, 9, 14]।