# 2**168 + 355 g = 374144419156711147060143317175368453031918731002211L
defshitty_hash(msg): h = h0 msg = map(ord, msg) for i in msg: h = (h + i) * g # This line is just to screw you up :)) h = h & 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
mod = 2 ** 256 h0 = 45740974929179720441799381904411404011270459520712533273451053262137196814399 g = 374144419156711147060143317175368453031918731002211 K = 2 ** 200 N = 50 y = [] for i inrange(N): y.append([]) for j inrange(N + 1): if i == j: y[i].append(Rational(1, 1)) elif j == N: y[i].append(Rational(K * pow(g, N - i, mod), 1)) else: y[i].append(Rational(0, 1)) defdot(x, y): n = len(x) ans = 0 for i inrange(n): ans += x[i] * y[i] return ans delta = Rational(99, 100) n, m = N, N + 1 y_star = [[y[0][i] for i inrange(m)]] mu = [[Rational(0, 1) for i inrange(m)] for j inrange(n)] for i inrange(1, n): print('Gram-Schmidt: i =', i) y_star.append([y[i][j] for j inrange(m)]) for j inrange(i): mu[i][j] = dot(y_star[j], y_star[i]) / dot(y_star[j], y_star[j]) for k inrange(m): y_star[i][k] -= y_star[j][k] * mu[i][j] gamma = [dot(y_star[i], y_star[i]) for i inrange(n)] defround(x): return (x + Rational(1, 2)).floor() defreduce(k, l): ifabs(mu[k][l]) > Rational(1, 2): for i inrange(m): y[k][i] -= round(mu[k][l]) * y[l][i] for j inrange(l): mu[k][j] -= round(mu[k][l]) * mu[l][j] mu[k][l] -= round(mu[k][l]) defexchange(k): y[k - 1], y[k] = y[k], y[k - 1] nu = mu[k][k - 1] delta = gamma[k] + nu * nu * gamma[k - 1] mu[k][k - 1] = nu * gamma[k - 1] / delta gamma[k] *= gamma[k - 1] / delta gamma[k - 1] = delta for j inrange(k - 1): mu[k - 1][j], mu[k][j] = mu[k][j], mu[k - 1][j] for i inrange(k + 1, n): xi = mu[i][k] mu[i][k] = mu[i][k - 1] - nu * mu[i][k] mu[i][k - 1] = mu[k][k - 1] * mu[i][k] + xi k = 1 maxk = 1 while k < n: if maxk < k: maxk = k print('LLL: new k =', k) reduce(k, k - 1) if gamma[k] >= (delta - mu[k][k - 1] ** 2) * gamma[k - 1]: for l inrange(k - 2, -1, -1): reduce(k, l) k = k + 1 else: exchange(k) if k > 1: k = k - 1 defshitty_hash(msg): h = h0 msg = map(ord, msg) for i in msg: h = (h + i) * g # This line is just to screw you up :)) h = h & 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
return h - 0xe6168647f636 s1 = 'a' * n s2 = '' for i inrange(n): s2 += chr(ord(s1[i]) + y[0][i]) print(y[0]) print(max(y[0]), min(y[0]), max(y[0]) - min(y[0])) print(s1) print(s2) print(shitty_hash(s1)) print(shitty_hash(s2)) if shitty_hash(s1) == shitty_hash(s2): print('ok') else: print('wa')
import fractions as f K = 2 ** 50 N = 50 cnt = 4 mod_ = [995662561, 995662609, 995662621, 998244353] base_ = [31, 31, 31, 31] y = [] for i inrange(N): y.append([]) for j inrange(N): if i == j: y[i].append(f.Fraction(1, 1)) else: y[i].append(f.Fraction(0, 1)) for j inrange(cnt): y[i].append(f.Fraction(pow(base_[j], N - i, mod_[j]) * K, 1)) defdot(x, y): n = len(x) ans = 0 for i inrange(n): ans += x[i] * y[i] return ans delta = f.Fraction(99, 100) n, m = N, N + cnt y_star = [[y[0][i] for i inrange(m)]] mu = [[f.Fraction(0, 1) for i inrange(m)] for j inrange(n)] for i inrange(1, n): print('Gram-Schmidt: i =', i) y_star.append([y[i][j] for j inrange(m)]) for j inrange(i): mu[i][j] = dot(y_star[j], y_star[i]) / dot(y_star[j], y_star[j]) for k inrange(m): y_star[i][k] -= y_star[j][k] * mu[i][j] gamma = [dot(y_star[i], y_star[i]) for i inrange(n)] defround(x): return (x + f.Fraction(1, 2)).__floor__() defreduce(k, l): ifabs(mu[k][l]) > f.Fraction(1, 2): for i inrange(m): y[k][i] -= round(mu[k][l]) * y[l][i] for j inrange(l): mu[k][j] -= round(mu[k][l]) * mu[l][j] mu[k][l] -= round(mu[k][l]) defexchange(k): y[k - 1], y[k] = y[k], y[k - 1] nu = mu[k][k - 1] delta = gamma[k] + nu * nu * gamma[k - 1] mu[k][k - 1] = nu * gamma[k - 1] / delta gamma[k] *= gamma[k - 1] / delta gamma[k - 1] = delta for j inrange(k - 1): mu[k - 1][j], mu[k][j] = mu[k][j], mu[k - 1][j] for i inrange(k + 1, n): xi = mu[i][k] mu[i][k] = mu[i][k - 1] - nu * mu[i][k] mu[i][k - 1] = mu[k][k - 1] * mu[i][k] + xi k = 1 maxk = 1 while k < n: if maxk < k: maxk = k print('LLL: new k =', k) reduce(k, k - 1) if gamma[k] >= (delta - mu[k][k - 1] ** 2) * gamma[k - 1]: for l inrange(k - 2, -1, -1): reduce(k, l) k = k + 1 else: exchange(k) if k > 1: k = k - 1 print(y[0]) s1 = s2 = '' for i inrange(n): now = int(y[0][i]) if now <= 0: s1 += 'a' s2 += chr(ord('a') - now) else: s1 += chr(ord('a') + now) s2 += 'a' print(s1) print(s2) defcalc_hash(s, b, m): ans = 0 for i inrange(len(s)): ans = (ans + (ord(s[i]) - ord('a')) * pow(b, N - i, m)) % m return ans for i inrange(cnt): print(calc_hash(s1, base_[i], mod_[i]), calc_hash(s2, base_[i], mod_[i]))
import fractions as f K = 2 ** 200 N = 50 cnt = 1 mod_ = [2305843009213693951] base_ = [1145141919] y = [] for i inrange(N): y.append([]) for j inrange(N): if i == j: y[i].append(f.Fraction(1, 1)) else: y[i].append(f.Fraction(0, 1)) for j inrange(cnt): #y[i].append(f.Fraction(pow(base_[j], N - i, mod_[j]) * K, 1)) y[i].append(f.Fraction((pow(base_[j], 2 * N - i - 1, mod_[j]) - pow(base_[j], i, mod_[j])) % mod_[j] * K, 1)) defdot(x, y): n = len(x) ans = 0 for i inrange(n): ans += x[i] * y[i] return ans delta = f.Fraction(99, 100) n, m = N, N + cnt y_star = [[y[0][i] for i inrange(m)]] mu = [[f.Fraction(0, 1) for i inrange(m)] for j inrange(n)] for i inrange(1, n): print('Gram-Schmidt: i =', i) y_star.append([y[i][j] for j inrange(m)]) for j inrange(i): mu[i][j] = dot(y_star[j], y_star[i]) / dot(y_star[j], y_star[j]) for k inrange(m): y_star[i][k] -= y_star[j][k] * mu[i][j] gamma = [dot(y_star[i], y_star[i]) for i inrange(n)] defround(x): return (x + f.Fraction(1, 2)).__floor__() defreduce(k, l): ifabs(mu[k][l]) > f.Fraction(1, 2): for i inrange(m): y[k][i] -= round(mu[k][l]) * y[l][i] for j inrange(l): mu[k][j] -= round(mu[k][l]) * mu[l][j] mu[k][l] -= round(mu[k][l]) defexchange(k): y[k - 1], y[k] = y[k], y[k - 1] nu = mu[k][k - 1] delta = gamma[k] + nu * nu * gamma[k - 1] mu[k][k - 1] = nu * gamma[k - 1] / delta gamma[k] *= gamma[k - 1] / delta gamma[k - 1] = delta for j inrange(k - 1): mu[k - 1][j], mu[k][j] = mu[k][j], mu[k - 1][j] for i inrange(k + 1, n): xi = mu[i][k] mu[i][k] = mu[i][k - 1] - nu * mu[i][k] mu[i][k - 1] = mu[k][k - 1] * mu[i][k] + xi k = 1 maxk = 1 while k < n: if maxk < k: maxk = k print('LLL: new k =', k) reduce(k, k - 1) if gamma[k] >= (delta - mu[k][k - 1] ** 2) * gamma[k - 1]: for l inrange(k - 2, -1, -1): reduce(k, l) k = k + 1 else: exchange(k) if k > 1: k = k - 1 print(y[0]) s1 = s2 = '' for i inrange(n): now = int(y[0][i]) if now <= 0: s1 += 'a' s2 += chr(ord('a') - now) else: s1 += chr(ord('a') + now) s2 += 'a' print(s1) print(s2) print(s1 + s2[::-1]) defcalc_hash(s, b, m): ans = 0 for i inrange(len(s)): ans = (ans + (ord(s[i]) - ord('a')) * pow(b, i, m)) % m return ans s = s1 + s2[::-1] #for i in range(cnt): # print(calc_hash(s1, base_[i], mod_[i]), calc_hash(s2, base_[i], mod_[i])) for i inrange(cnt): print(calc_hash(s, base_[i], mod_[i]), calc_hash(s[::-1], base_[i], mod_[i]))