import math
import random
secret = int(input("Введите секрет:"))
all = int(input("Количество частей:"))
minimum = int(input("Минимальное число частей для восстоновления:"))
def is_simple(p):
for i in range(2, int(math.sqrt(p))+2):
if p % i == 0:
return False
return True
def get_next_simple(secret):
for p in range(secret + 1, s+ 100000000):
if is_simple(p):
return p
return 0
def f(x, entropy, secret):
ret = 0
xx = 1
entropyx = [secret] + entropy
for a in entropyx:
ret += xx * a
xx *= x
return ret
points = int(input("Введите полученный части:"))
#Востоновление
def lag(x, points):
ret = 0
n = len(points)
for i in range(n):
xi, yi = points[i]
li = 1
for j in range(n):
if i!=j:
xj,yj = points[j]
li*=(x-xj)/(xi-xj)
ret+=li*yi
return ret
# разделение секрета
entropy = [0] * (minimum-1)
for i in range(minimum-1):
entropy[i] = random.randint(0, 100)
shares = [0] * all # [0,0,0,0,0,0]
for i in range(all):
xi = i+1
yi = f(xi, entropy, secret)
shares[i] = [xi,yi]
print(entropy)
print(shares)
# удаление лишнего секрета
shares.pop(2)
points = shares
# восстановление секрета
revided = round(lag(0, points))
print(points) #Полученные точки
print(revided)
print(f(0, entropy, secret)) #Вывод секреты