Учитывая n
(количество игроков), t
(пороговое значение) и s
(секрет), выведите n
секреты, сгенерированные алгоритмом Shamir's Secret Sharing .
Алгоритм
Для целей этой задачи вычисления будут выполняться в GF (251) (конечное поле размера 251
, также известное как mod 251 целых чисел ). Обычно поле выбирается таким образом, чтобы его размер был больше простого числа n
. Чтобы упростить задачу, размер поля будет постоянным. 251
был выбран, потому что это наибольшее простое число, представимое 8-битным целым числом без знака.
- Генерация
t-1
случайных целых чисел в (включительно) диапазоне[0, 250]
. Добавьте эти с 1 через в Т-1 . - Построить
t-1
полином i-й степени, используяs
в качестве значения константы и случайные целые числа из шага 1 в качестве коэффициентов степеней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
).- Ввод и вывод могут быть в любом разумном, однозначном и согласованном формате.
- Случайные числа должны выбираться из равномерного распределения - каждое возможное значение должно иметь равную вероятность выбора.
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
источник
источник
z
иf(z)
? Если я печатаю массивf(z)
s по порядку,z
подразумевается индекс.[[1, 5], [2, 2], [3, 9], [4, 14]]
не содержит больше информации, чем[5, 2, 9, 14]
.Ответы:
Желе , 15 байт
Ожидает t , n и s в качестве аргументов командной строки. Попробуйте онлайн!
Как это устроено
источник
Mathematica,
5956 байтПринимает три аргумента в порядке t , n и s . Создает 2d-массив с n строками и t -1 столбцами. Каждый вектор строки j , пронумерованный от 1 до n , содержит степени от j до j t -1 . Затем создается вектор случайных целых коэффициентов в диапазоне от 0 до 250 со значениями t -1. Это умножается на матрицу с 2d-массивом, а затем добавляется s поэлементно и берется модуль 251, чтобы получить значение многочлена в каждой из n точек.
источник
Sum
!Mod[x#+#2&~Fold~RandomInteger[250,#2-1]x+#3/.x->Range@#,251]&
CJam,
2725 байтовПроверьте это здесь.
источник
Pyth, 24 байта
Попробуйте онлайн!
Порядок ввода:
n
s
t
разделенный переводом строки.источник
JavaScript, 181 байт
Ungolfed:
Я не знаю, как правильно это проверить, но я знаю, что было сложно заставить JS отображать новый массив, поскольку, очевидно,
.map
пропускает неопределенные значения. Если кто-нибудь увидит какие-либо способы улучшения или недостатки, не стесняйтесь, дайте мне знать.источник
(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
, что кажется неправильным. Ваш код также, кажется, предполагает индексирование на основе 1.[...Array()]
немного короче чемfiil()
. Кроме того, последние две строки могут быть уменьшены доreturn _.map(f);
C #,
138134 байтаC # лямбда, где входные
int
и выходные данныеIEnumerable<double>
. Вы можете попробовать мой код на .NetFiddle .Я не уверен на 100% в правильности моего алгоритма, пожалуйста, прокомментируйте, если я что-то неправильно понял.
4 байта , сохраненный с помощью @ рэггами в трюке .
источник
MATL ,
2019 байтовВходной заказ
t
,s
,n
.Попробуйте онлайн!
объяснение
источник
Юлия, 48 байтов
Попробуйте онлайн!
источник
JavaScript (ES6), 116 байт
Я хотел бы думать, что это один из редких случаев, когда
reduce
ударыmap
.источник
Python 3 с NumPy , 103 байта
Я могу честно сказать, что я никогда не ожидал использовать NumPy для кода гольфа ...
Анонимная функция, которая принимает входные данные через аргумент и возвращает список.
Как это устроено
Попробуйте это на Ideone
источник
J ,
3230 байтПринимает список со значениями n , t и s .
Сохраненный 2 байта, используя заменить на индекс 0 идеи от @ Денниса решения .
объяснение
источник
Java 8, 224 байта:
Java 8 лямбда-выражение. Выводит разделенный запятыми массив целых чисел и прекрасно работает до тех пор, пока значения в выходном массиве не выйдут за пределы диапазона типа данных Java
long
или 64-разрядного целого числа со знаком, при котором они-200
выводятся в массив.Попробуйте онлайн! (Ideone)
источник