require 'openssl' def modinv(a, m) m0, inv, x0 = m, 1, 0 while a > 1 inv -= (a / m) * x0 a, m = m, a % m inv, x0 = x0, inv end inv += m0 if inv < 0 inv end x0 = 171988490999968958074461906163126253991 x1 = 149759767375550138601832127658924300851 x2 = 21392649857558566532141954695914673807 x3 = 52236160143411890255640980579270361316 x4 = 22081153611165744867415455406756477578 r0 = x1 - x0 r1 = x2 - x1 r2 = x3 - x2 r3 = x4 - x3 m1 = r0 * r3 - r1 * r2 m2 = r0 * r2 - r1 * r1 puts(m1.gcd(m2)) m = 176112297761995517109581492781981180247 x = x0 a = r1 * modinv(r0 % m, m) % m b = (x1 - a * x) % m puts(x1) puts((a * x + b) % m) puts(x2) puts((a * x1 + b) % m) puts(x3) puts((a * x2 + b) % m) x5 = (a * x4 + b) % m puts("x5 = #{x5}")