$f(x) = -4x^3+7x^2-2x+2023$
f = lambda x : -4*x**3+7*x**2-2*x+2023
[f(i) for i in range(11)]
[2023, 2024, 2015, 1972, 1871, 1688, 1399, 980, 407, -344, -1297]
keys = [(i, f(i)) for i in range(1, 11)]
print(*keys)
(1, 2024) (2, 2015) (3, 1972) (4, 1871) (5, 1688) (6, 1399) (7, 980) (8, 407) (9, -344) (10, -1297)
from random import sample
sample(keys, k=4)
[(10, -1297), (3, 1972), (7, 980), (5, 1688)]
from scipy.interpolate import lagrange
lagrange([1,2,3,4], [2024, 2015, 1972, 1871])
poly1d([-3.9999999999999432e+00, 7.0000000000000000e+00, -1.9999999999995453e+00, 2.0230000000000000e+03])
lp = lagrange([1,2,3,4], [2024, 2015, 1972, 1871])
lp.coef
array([-3.9999999999999432e+00, 7.0000000000000000e+00, -1.9999999999995453e+00, 2.0230000000000000e+03])
lp(0)
2023.0
from numpy import polyfit, polyval
polyfit([1,2,3,4], [2024, 2015, 1972, 1871], 3)
array([-4.000000000000004e+00, 7.000000000000696e+00, -2.000000000002289e+00, 2.023000000000001e+03])
lp = polyfit([1,2,3,4], [2024, 2015, 1972, 1871], 3)
polyval(lp, 0)
2023.000000000001
import numpy as np
np.polynomial.polynomial.Polynomial.fit([1,2,3,4], [2024, 2015, 1972, 1871], 3).convert()
np.polynomial.polynomial.Polynomial.fit([1,2,3,4], [2024, 2015, 1972, 1871], 3).convert().coef
array([ 2.0229999999999993e+03, -1.9999999999997184e+00, 6.9999999999998455e+00, -3.9999999999999742e+00])
lp = np.polynomial.polynomial.Polynomial.fit([1,2,3,4], [2024, 2015, 1972, 1871], 3)
lp(0)
2022.9999999999993
triple = sample(keys, k=3)
print(triple)
[(1, 2024), (9, -344), (5, 1688)]
Firstly, any four keys should generate original polynomial...
keys[:4]
[(1, 2024), (2, 2015), (3, 1972), (4, 1871)]
lagrange([1,2,3,4], [2024, 2015, 1972, 1871])
poly1d([-4.000e+00, 7.000e+00, -2.000e+00, 2.023e+03])
keys[-4:]
[(7, 980), (8, 407), (9, -344), (10, -1297)]
lagrange([7,8,9,10], [980, 407, -344, -1297])
poly1d([-4.000e+00, 7.000e+00, -2.000e+00, 2.023e+03])
comb = sample(keys, k=4)
print(comb)
((7, 980), (8, 407), (9, -344), (10, -1297))
lagrange([key[0] for key in comb], [key[1] for key in comb])
poly1d([-4.000e+00, 7.000e+00, -2.000e+00, 2.023e+03])
print(list(zip(*comb)))
[(7, 8, 9, 10), (980, 407, -344, -1297)]
lagrange(*zip(*comb))
poly1d([-4.000e+00, 7.000e+00, -2.000e+00, 2.023e+03])
from itertools import combinations
list(combinations(keys[:6], r=4))
[((1, 2024), (2, 2015), (3, 1972), (4, 1871)), ((1, 2024), (2, 2015), (3, 1972), (5, 1688)), ((1, 2024), (2, 2015), (3, 1972), (6, 1399)), ((1, 2024), (2, 2015), (4, 1871), (5, 1688)), ((1, 2024), (2, 2015), (4, 1871), (6, 1399)), ((1, 2024), (2, 2015), (5, 1688), (6, 1399)), ((1, 2024), (3, 1972), (4, 1871), (5, 1688)), ((1, 2024), (3, 1972), (4, 1871), (6, 1399)), ((1, 2024), (3, 1972), (5, 1688), (6, 1399)), ((1, 2024), (4, 1871), (5, 1688), (6, 1399)), ((2, 2015), (3, 1972), (4, 1871), (5, 1688)), ((2, 2015), (3, 1972), (4, 1871), (6, 1399)), ((2, 2015), (3, 1972), (5, 1688), (6, 1399)), ((2, 2015), (4, 1871), (5, 1688), (6, 1399)), ((3, 1972), (4, 1871), (5, 1688), (6, 1399))]
for comb in combinations(keys, r=4):
lp = lagrange(*zip(*comb))
print([key[0] for key in comb])
print(f'{lp(0):.0f}', *lp)
[1, 2, 3, 4] 2023 -3.999999999999943 7.0 -1.9999999999995453 2023.0 [1, 2, 3, 5] 2023 -4.000000000000043 7.0 -1.9999999999994316 2023.0 [1, 2, 3, 6] 2023 -3.9999999999999396 6.9999999999996305 -1.9999999999993179 2022.9999999999995 [1, 2, 3, 7] 2023 -3.999999999999991 7.0 -2.000000000000611 2023.0 [1, 2, 3, 8] 2023 -4.0000000000000195 6.9999999999999485 -1.9999999999999076 2022.9999999999995 [1, 2, 3, 9] 2023 -4.000000000000005 7.000000000000259 -1.9999999999992628 2022.9999999999993 [1, 2, 3, 10] 2023 -4.000000000000016 7.00000000000027 -2.000000000000835 2023.0000000000005 [1, 2, 4, 5] 2023 -4.0 7.000000000000114 -1.9999999999988631 2022.9999999999989 [1, 2, 4, 6] 2023 -3.999999999999993 6.999999999999801 -1.9999999999991473 2022.9999999999993 [1, 2, 4, 7] 2023 -3.99999999999997 6.999999999999957 -2.0000000000003695 2022.9999999999998 [1, 2, 4, 8] 2023 -3.9999999999999893 6.999999999999812 -2.000000000000078 2022.9999999999993 [1, 2, 4, 9] 2023 -4.000000000000008 6.999999999999977 -2.0000000000004086 2022.9999999999998 [1, 2, 4, 10] 2023 -3.999999999999977 6.999999999999893 -2.0000000000002416 2023.0000000000002 [1, 2, 5, 6] 2023 -4.0 6.999999999999886 -2.0 2023.0 [1, 2, 5, 7] 2023 -3.9999999999999822 6.999999999999858 -2.000000000000057 2023.0000000000002 [1, 2, 5, 8] 2023 -4.000000000000005 6.999999999999922 -2.0000000000010445 2022.9999999999998 [1, 2, 5, 9] 2023 -4.000000000000015 7.000000000000064 -2.000000000000078 2022.9999999999998 [1, 2, 5, 10] 2023 -4.0000000000000036 7.000000000000142 -1.9999999999992824 2023.0 [1, 2, 6, 7] 2023 -4.000000000000007 7.0 -2.0000000000005684 2023.0 [1, 2, 6, 8] 2023 -4.000000000000007 6.999999999999922 -2.000000000000256 2022.9999999999993 [1, 2, 6, 9] 2023 -4.000000000000007 6.999999999999925 -1.9999999999993037 2022.999999999999 [1, 2, 6, 10] 2023 -3.9999999999999973 6.999999999999915 -1.9999999999997584 2022.9999999999998 [1, 2, 7, 8] 2023 -4.0 7.000000000000085 -2.000000000000256 2022.9999999999998 [1, 2, 7, 9] 2023 -3.9999999999999982 6.999999999999936 -1.9999999999995168 2022.9999999999995 [1, 2, 7, 10] 2023 -3.999999999999991 7.0 -2.0000000000003126 2023.0000000000005 [1, 2, 8, 9] 2023 -4.0000000000000036 6.999999999999844 -1.999999999999801 2022.9999999999989 [1, 2, 8, 10] 2023 -3.9999999999999947 6.999999999999915 -2.000000000000142 2023.0000000000002 [1, 2, 9, 10] 2023 -4.0000000000000036 7.000000000000114 -2.000000000000341 2022.9999999999998 [1, 3, 4, 5] 2023 -3.999999999999943 7.0 -1.999999999998181 2023.0 [1, 3, 4, 6] 2023 -4.00000000000005 6.999999999999943 -1.9999999999995453 2022.9999999999995 [1, 3, 4, 7] 2023 -3.999999999999977 6.999999999999815 -1.9999999999993179 2023.0000000000007 [1, 3, 4, 8] 2023 -3.9999999999999587 6.999999999999446 -1.9999999999993108 2022.9999999999989 [1, 3, 4, 9] 2023 -4.000000000000011 6.99999999999997 -1.999999999998849 2023.0000000000002 [1, 3, 4, 10] 2023 -3.999999999999965 6.999999999999719 -1.999999999998252 2023.0000000000002 [1, 3, 5, 6] 2023 -4.000000000000014 7.000000000000114 -1.9999999999995453 2023.0 [1, 3, 5, 7] 2023 -3.999999999999993 7.000000000000028 -2.0000000000002274 2023.0 [1, 3, 5, 8] 2023 -3.999999999999983 6.999999999999851 -1.9999999999991473 2022.9999999999998 [1, 3, 5, 9] 2023 -4.000000000000009 7.0 -2.0000000000002984 2023.0 [1, 3, 5, 10] 2023 -4.0000000000000036 6.999999999999915 -1.9999999999997442 2023.0000000000002 [1, 3, 6, 7] 2023 -4.000000000000014 7.000000000000227 -2.000000000000682 2023.0 [1, 3, 6, 8] 2023 -3.9999999999999956 6.999999999999972 -1.9999999999995453 2022.9999999999995 [1, 3, 6, 9] 2023 -4.000000000000006 7.000000000000085 -2.0 2022.9999999999995 [1, 3, 6, 10] 2023 -4.000000000000008 7.000000000000043 -2.000000000000284 2022.9999999999998 [1, 3, 7, 8] 2023 -3.9999999999999876 6.999999999999844 -1.9999999999998295 2022.9999999999998 [1, 3, 7, 9] 2023 -4.000000000000001 7.0000000000000355 -1.99999999999973 2023.0 [1, 3, 7, 10] 2023 -3.999999999999992 6.999999999999972 -1.999999999999801 2023.0 [1, 3, 8, 9] 2023 -3.9999999999999964 6.999999999999943 -1.9999999999995453 2022.9999999999995 [1, 3, 8, 10] 2023 -3.9999999999999956 6.999999999999957 -1.999999999999602 2022.9999999999995 [1, 3, 9, 10] 2023 -4.0000000000000036 7.000000000000057 -2.000000000000341 2022.9999999999998 [1, 4, 5, 6] 2023 -4.000000000000028 7.0 -2.0000000000022737 2023.0 [1, 4, 5, 7] 2023 -4.000000000000039 7.000000000000455 -2.0000000000009095 2023.0 [1, 4, 5, 8] 2023 -4.000000000000007 7.000000000000242 -2.000000000000739 2022.9999999999995 [1, 4, 5, 9] 2023 -3.9999999999999942 7.0 -1.9999999999996376 2022.9999999999995 [1, 4, 5, 10] 2023 -4.000000000000014 7.000000000000313 -2.0000000000008527 2023.0000000000002 [1, 4, 6, 7] 2023 -4.000000000000021 7.000000000000341 -1.9999999999995453 2023.0 [1, 4, 6, 8] 2023 -4.000000000000011 7.0 -1.9999999999993747 2022.9999999999998 [1, 4, 6, 9] 2023 -3.999999999999999 7.000000000000028 -1.9999999999999716 2022.9999999999998 [1, 4, 6, 10] 2023 -4.000000000000011 7.000000000000057 -1.9999999999990905 2022.9999999999998 [1, 4, 7, 8] 2023 -4.0 6.999999999999915 -1.9999999999994316 2022.999999999999 [1, 4, 7, 9] 2023 -3.9999999999999956 6.999999999999972 -1.9999999999997158 2023.0 [1, 4, 7, 10] 2023 -4.000000000000002 6.999999999999943 -1.9999999999997726 2023.0 [1, 4, 8, 9] 2023 -3.9999999999999982 7.000000000000014 -1.9999999999995453 2022.9999999999998 [1, 4, 8, 10] 2023 -4.000000000000002 6.999999999999943 -2.0000000000001137 2022.9999999999998 [1, 4, 9, 10] 2023 -4.0 7.000000000000057 -2.0 2023.0000000000002 [1, 5, 6, 7] 2023 -4.000000000000028 7.000000000000227 -2.000000000001819 2023.0000000000005 [1, 5, 6, 8] 2023 -4.000000000000014 6.999999999999943 -2.000000000000057 2022.9999999999995 [1, 5, 6, 9] 2023 -4.000000000000004 7.0 -1.9999999999996874 2023.0 [1, 5, 6, 10] 2023 -3.999999999999993 6.999999999999744 -1.9999999999998295 2023.0000000000002 [1, 5, 7, 8] 2023 -3.999999999999993 6.999999999999801 -1.9999999999995453 2022.9999999999998 [1, 5, 7, 9] 2023 -3.999999999999993 6.999999999999886 -1.9999999999995453 2023.0 [1, 5, 7, 10] 2023 -3.9999999999999893 6.999999999999972 -1.9999999999995453 2023.0000000000002 [1, 5, 8, 9] 2023 -4.0 6.999999999999886 -1.9999999999995453 2022.9999999999998 [1, 5, 8, 10] 2023 -4.0 6.999999999999972 -1.9999999999998863 2023.0 [1, 5, 9, 10] 2023 -4.0 7.0 -2.0 2023.0 [1, 6, 7, 8] 2023 -3.999999999999986 7.0 -1.9999999999993179 2022.9999999999982 [1, 6, 7, 9] 2023 -3.9999999999999947 6.999999999999844 -1.9999999999987494 2022.9999999999986 [1, 6, 7, 10] 2023 -3.999999999999986 6.999999999999943 -2.0000000000002274 2022.9999999999998 [1, 6, 8, 9] 2023 -3.9999999999999964 6.999999999999886 -1.9999999999994316 2022.999999999999 [1, 6, 8, 10] 2023 -3.9999999999999964 6.999999999999886 -1.9999999999993179 2023.0 [1, 6, 9, 10] 2023 -4.000000000000007 7.0 -1.9999999999995453 2022.9999999999998 [1, 7, 8, 9] 2023 -4.0 7.000000000000227 -2.0000000000009095 2023.000000000001 [1, 7, 8, 10] 2023 -4.000000000000007 7.0 -2.0 2023.0000000000002 [1, 7, 9, 10] 2023 -4.0 7.000000000000114 -2.0000000000009095 2023.000000000001 [1, 8, 9, 10] 2023 -4.0 7.0 -2.0 2023.0 [2, 3, 4, 5] 2023 -3.999999999999943 7.0 -2.000000000001819 2023.0 [2, 3, 4, 6] 2023 -4.000000000000078 7.0 -2.000000000002501 2023.0 [2, 3, 4, 7] 2023 -3.9999999999999822 7.0 -2.0000000000012506 2023.0 [2, 3, 4, 8] 2023 -3.9999999999999565 6.999999999999638 -1.9999999999973426 2022.9999999999977 [2, 3, 4, 9] 2023 -4.000000000000048 7.00000000000035 -2.0000000000013145 2023.000000000001 [2, 3, 4, 10] 2023 -3.9999999999999822 6.999999999999865 -1.999999999997982 2022.9999999999984 [2, 3, 5, 6] 2023 -4.000000000000014 7.000000000000682 -1.9999999999990905 2023.0 [2, 3, 5, 7] 2023 -4.0 7.0 -2.0000000000009095 2023.0 [2, 3, 5, 8] 2023 -3.999999999999961 6.99999999999973 -1.999999999999062 2022.9999999999984 [2, 3, 5, 9] 2023 -3.9999999999999964 7.00000000000022 -2.000000000001016 2023.0000000000007 [2, 3, 5, 10] 2023 -3.9999999999999902 7.000000000000128 -2.0000000000018474 2022.9999999999995 [2, 3, 6, 7] 2023 -4.000000000000014 7.0 -2.0 2023.0 [2, 3, 6, 8] 2023 -3.999999999999991 6.999999999999773 -1.9999999999993747 2022.9999999999989 [2, 3, 6, 9] 2023 -4.000000000000002 7.000000000000117 -2.0000000000011937 2023.0000000000005 [2, 3, 6, 10] 2023 -4.0000000000000195 7.000000000000291 -2.0000000000014495 2022.999999999999 [2, 3, 7, 8] 2023 -3.9999999999999822 6.999999999999716 -1.9999999999993179 2022.9999999999993 [2, 3, 7, 9] 2023 -4.000000000000007 7.000000000000028 -2.000000000000398 2023.0 [2, 3, 7, 10] 2023 -3.9999999999999964 7.000000000000028 -2.0000000000001705 2023.0 [2, 3, 8, 9] 2023 -3.9999999999999893 6.999999999999815 -1.9999999999986358 2022.9999999999998 [2, 3, 8, 10] 2023 -3.9999999999999982 6.999999999999943 -1.9999999999989768 2022.9999999999995 [2, 3, 9, 10] 2023 -4.000000000000007 7.000000000000284 -2.0000000000004547 2023.0 [2, 4, 5, 6] 2023 -3.999999999999943 7.0 -2.0 2023.0 [2, 4, 5, 7] 2023 -4.000000000000021 7.0000000000001705 -1.9999999999988631 2022.9999999999977 [2, 4, 5, 8] 2023 -3.9999999999999947 6.999999999999645 -1.9999999999992042 2022.9999999999984 [2, 4, 5, 9] 2023 -3.9999999999999734 6.99999999999951 -1.9999999999999574 2023.0000000000005 [2, 4, 5, 10] 2023 -3.9999999999999982 7.000000000000128 -1.9999999999988631 2022.9999999999989 [2, 4, 6, 7] 2023 -4.000000000000014 7.0 -1.9999999999995453 2023.0 [2, 4, 6, 8] 2023 -3.999999999999991 7.0 -1.9999999999997158 2023.0 [2, 4, 6, 9] 2023 -3.999999999999983 6.999999999999801 -1.9999999999999432 2023.000000000001 [2, 4, 6, 10] 2023 -4.000000000000004 7.0 -1.9999999999997158 2023.0 [2, 4, 7, 8] 2023 -3.9999999999999964 7.000000000000057 -1.9999999999989768 2022.9999999999986 [2, 4, 7, 9] 2023 -3.9999999999999964 7.000000000000163 -2.0000000000006253 2023.0000000000002 [2, 4, 7, 10] 2023 -4.0000000000000036 7.000000000000057 -1.9999999999998295 2022.9999999999989 [2, 4, 8, 9] 2023 -3.9999999999999893 7.0 -2.0000000000002274 2022.9999999999995 [2, 4, 8, 10] 2023 -4.0 7.000000000000028 -1.9999999999993179 2022.999999999999 [2, 4, 9, 10] 2023 -3.999999999999993 6.9999999999998295 -1.9999999999993179 2022.9999999999995 [2, 5, 6, 7] 2023 -4.000000000000028 7.0 -2.000000000001819 2023.0 [2, 5, 6, 8] 2023 -4.000000000000018 7.000000000000426 -2.0000000000015916 2023.0000000000005 [2, 5, 6, 9] 2023 -4.000000000000007 7.000000000000277 -2.000000000001137 2022.9999999999995 [2, 5, 6, 10] 2023 -3.9999999999999982 7.0000000000000995 -2.0000000000013074 2023.0 [2, 5, 7, 8] 2023 -4.000000000000007 7.000000000000114 -2.0000000000002274 2023.0000000000014 [2, 5, 7, 9] 2023 -4.0000000000000036 7.0 -1.9999999999998863 2023.000000000001 [2, 5, 7, 10] 2023 -4.0000000000000036 7.0000000000001705 -2.0000000000002274 2023.0000000000014 [2, 5, 8, 9] 2023 -3.999999999999993 6.9999999999998295 -1.9999999999995453 2022.9999999999995 [2, 5, 8, 10] 2023 -3.9999999999999964 7.0 -2.0000000000004547 2023.0 [2, 5, 9, 10] 2023 -4.0000000000000036 7.000000000000114 -1.9999999999995453 2023.000000000001 [2, 6, 7, 8] 2023 -3.999999999999993 7.0 -1.9999999999990905 2023.0 [2, 6, 7, 9] 2023 -4.0 6.999999999999957 -2.000000000001137 2023.0 [2, 6, 7, 10] 2023 -3.9999999999999947 7.0 -2.000000000000341 2023.0 [2, 6, 8, 9] 2023 -3.999999999999993 7.0 -1.9999999999995453 2023.0 [2, 6, 8, 10] 2023 -3.9999999999999964 7.0 -1.9999999999995453 2023.0 [2, 6, 9, 10] 2023 -4.0 7.0 -2.0 2023.000000000001 [2, 7, 8, 9] 2023 -3.999999999999986 6.999999999999886 -2.0000000000009095 2023.0 [2, 7, 8, 10] 2023 -3.9999999999999964 7.0 -2.0 2022.9999999999986 [2, 7, 9, 10] 2023 -4.0 7.0 -1.9999999999990905 2023.000000000001 [2, 8, 9, 10] 2023 -4.0 7.0 -2.000000000001819 2023.0 [3, 4, 5, 6] 2023 -3.9999999999999716 7.0 -1.999999999996362 2023.0 [3, 4, 5, 7] 2023 -4.000000000000043 7.000000000000057 -1.9999999999977263 2022.9999999999927 [3, 4, 5, 8] 2023 -4.000000000000027 7.00000000000054 -1.9999999999990337 2023.0 [3, 4, 5, 9] 2023 -3.9999999999999356 6.999999999999453 -1.9999999999997442 2023.0 [3, 4, 5, 10] 2023 -4.000000000000035 7.000000000000284 -1.999999999998579 2023.000000000001 [3, 4, 6, 7] 2023 -4.0 6.9999999999990905 -1.999999999998181 2023.0 [3, 4, 6, 8] 2023 -3.9999999999999964 7.000000000000085 -2.000000000000796 2023.0000000000023 [3, 4, 6, 9] 2023 -3.9999999999999565 6.999999999999332 -1.9999999999976126 2022.9999999999993 [3, 4, 6, 10] 2023 -3.999999999999986 6.9999999999993605 -2.0000000000001705 2023.0000000000014 [3, 4, 7, 8] 2023 -4.000000000000007 7.000000000000114 -2.0000000000013642 2023.0000000000016 [3, 4, 7, 9] 2023 -3.999999999999985 6.999999999999787 -1.9999999999997726 2022.9999999999977 [3, 4, 7, 10] 2023 -4.000000000000012 7.0000000000001705 -2.0 2022.9999999999977 [3, 4, 8, 9] 2023 -3.999999999999991 7.000000000000114 -1.9999999999997726 2023.0000000000011 [3, 4, 8, 10] 2023 -4.0000000000000036 7.000000000000028 -1.9999999999986358 2023.0000000000002 [3, 4, 9, 10] 2023 -3.9999999999999787 6.999999999999602 -1.9999999999968168 2023.0000000000014 [3, 5, 6, 7] 2023 -3.999999999999943 7.0 -1.999999999996362 2023.0 [3, 5, 6, 8] 2023 -4.000000000000025 7.000000000000512 -1.9999999999970441 2023.0 [3, 5, 6, 9] 2023 -3.999999999999977 7.000000000000199 -1.999999999998181 2023.0 [3, 5, 6, 10] 2023 -3.9999999999999662 7.0000000000001705 -1.999999999996703 2023.0000000000005 [3, 5, 7, 8] 2023 -4.000000000000021 7.0 -2.0000000000013642 2023.0 [3, 5, 7, 9] 2023 -3.9999999999999947 7.0 -1.9999999999993747 2023.0 [3, 5, 7, 10] 2023 -3.9999999999999893 7.000000000000057 -2.000000000001137 2023.0 [3, 5, 8, 9] 2023 -4.0000000000000036 7.0000000000001705 -2.000000000000682 2023.0 [3, 5, 8, 10] 2023 -4.0 7.000000000000114 -2.0000000000002274 2023.0000000000005 [3, 5, 9, 10] 2023 -3.999999999999993 6.999999999999773 -2.0 2022.999999999999 [3, 6, 7, 8] 2023 -4.000000000000014 6.999999999999773 -2.0000000000009095 2023.0000000000018 [3, 6, 7, 9] 2023 -4.000000000000011 7.0000000000001705 -2.0 2023.0 [3, 6, 7, 10] 2023 -3.999999999999986 7.0 -2.000000000000682 2023.0 [3, 6, 8, 9] 2023 -4.000000000000007 7.000000000000057 -2.000000000001819 2023.0 [3, 6, 8, 10] 2023 -4.0 6.999999999999943 -2.0000000000009095 2022.9999999999995 [3, 6, 9, 10] 2023 -4.0 7.0 -1.9999999999990905 2023.0 [3, 7, 8, 9] 2023 -4.000000000000007 7.0 -1.9999999999990905 2023.0 [3, 7, 8, 10] 2023 -4.000000000000014 7.0 -1.9999999999995453 2023.0 [3, 7, 9, 10] 2023 -4.0 7.0 -2.0 2023.0 [3, 8, 9, 10] 2023 -4.0 6.999999999999773 -1.999999999998181 2023.0 [4, 5, 6, 7] 2023 -3.999999999999943 7.000000000000455 -2.000000000007276 2023.0000000000036 [4, 5, 6, 8] 2023 -4.000000000000039 7.0 -2.000000000004775 2023.0 [4, 5, 6, 9] 2023 -4.000000000000012 7.0 -2.0000000000002274 2023.0 [4, 5, 6, 10] 2023 -3.999999999999968 7.0 -2.000000000001023 2023.0 [4, 5, 7, 8] 2023 -3.999999999999993 6.999999999999432 -2.0000000000022737 2023.0000000000018 [4, 5, 7, 9] 2023 -3.999999999999991 6.999999999999858 -2.000000000000796 2023.0000000000036 [4, 5, 7, 10] 2023 -3.9999999999999645 6.999999999999318 -1.9999999999990905 2023.0000000000045 [4, 5, 8, 9] 2023 -4.000000000000018 7.000000000000341 -2.000000000001819 2023.0 [4, 5, 8, 10] 2023 -3.9999999999999964 6.999999999999602 -2.0000000000022737 2023.000000000005 [4, 5, 9, 10] 2023 -4.0 7.000000000000227 -2.0000000000009095 2023.0 [4, 6, 7, 8] 2023 -3.999999999999943 6.9999999999990905 -1.999999999996362 2022.9999999999927 [4, 6, 7, 9] 2023 -3.9999999999999964 6.999999999999915 -2.0000000000015916 2022.9999999999984 [4, 6, 7, 10] 2023 -3.9999999999999716 6.999999999999773 -1.9999999999970441 2023.0000000000014 [4, 6, 8, 9] 2023 -4.000000000000007 7.0 -2.0000000000009095 2022.999999999999 [4, 6, 8, 10] 2023 -3.9999999999999964 7.0 -2.0000000000004547 2023.0 [4, 6, 9, 10] 2023 -4.000000000000007 7.0 -2.0 2023.0 [4, 7, 8, 9] 2023 -4.000000000000021 7.000000000000455 -2.000000000001819 2023.0000000000082 [4, 7, 8, 10] 2023 -4.0 6.999999999999886 -2.000000000001819 2023.0000000000036 [4, 7, 9, 10] 2023 -4.0 6.999999999999773 -2.0 2023.0000000000055 [4, 8, 9, 10] 2023 -4.0 7.0 -1.999999999998181 2023.0 [5, 6, 7, 8] 2023 -3.999999999999986 7.0 -1.9999999999972715 2023.0 [5, 6, 7, 9] 2023 -4.000000000000018 7.0 -1.9999999999949978 2023.0 [5, 6, 7, 10] 2023 -3.999999999999993 7.000000000000114 -2.0 2023.0 [5, 6, 8, 9] 2023 -3.999999999999993 7.000000000000341 -2.0000000000022737 2023.0 [5, 6, 8, 10] 2023 -4.0 7.000000000000227 -2.0000000000004547 2023.0 [5, 6, 9, 10] 2023 -4.000000000000021 7.0 -2.000000000003638 2023.0 [5, 7, 8, 9] 2023 -3.9999999999999716 7.0 -2.0 2023.0000000000073 [5, 7, 8, 10] 2023 -4.000000000000014 7.0 -2.000000000001819 2023.0000000000055 [5, 7, 9, 10] 2023 -4.000000000000014 7.000000000000227 -2.000000000001819 2023.0 [5, 8, 9, 10] 2023 -4.000000000000028 7.000000000000455 -2.0 2023.0 [6, 7, 8, 9] 2023 -3.9999999999999574 7.0 -1.999999999994543 2023.0 [6, 7, 8, 10] 2023 -4.0000000000000355 7.0 -1.999999999998181 2023.0 [6, 7, 9, 10] 2023 -4.000000000000014 7.0 -2.0 2023.0 [6, 8, 9, 10] 2023 -4.0 7.0 -2.0 2023.0 [7, 8, 9, 10] 2023 -3.9999999999999716 7.0 -2.000000000007276 2023.0
Show that the key could be 1111, i.e. find the fourth key which generates Polynomial with constant coefficient 1111.
comb = sample(keys, k=3)
comb
[(5, 1688), (10, -1297), (4, 1871)]
Get the corresponding polynomial (using the fact that secret is $f(0)$)
lagrange([5, 10, 4, 0], [1688, -1297, 1871, 1111])
poly1d([ 5.600e-01, -7.964e+01, 4.996e+02, 1.111e+03])
Calculate the new key, choosing index and corresponding value...
lp = lagrange([5, 10, 4, 0], [1688, -1297, 1871, 1111])
lp(15)
-7424.000000000078
The example that from given 3 keys the PIN could be 1111:
lagrange([5, 10, 4, 15], [1688, -1297, 1871, -7424])
poly1d([ 5.600e-01, -7.964e+01, 4.996e+02, 1.111e+03])