📜  彼得森图问题(1)

📅  最后修改于: 2023-12-03 15:39:33.386000             🧑  作者: Mango

彼得森图问题介绍

彼得森图问题是著名的密码学难题之一,由恩斯特·彼得森(Ernst Eduard Kummer)于19世纪初提出。该问题在密码学中有着重要的应用。

问题描述

彼得森图问题是一种在密码学中广泛应用的问题,简单来说就是求一个序列的线性周期,具体描述如下:

给定一个字符串S和一个大于1的正整数N,S的长度为M,将S中的字符按每N个一组分成若干个小组,其中每个小组内的字符个数都为N(最后一个小组可能不足N个)。对于每个小组i,我们将其和后面M/N-1个小组进行异或操作,于是,每个小组都变成了一个长度为N的二进制序列。假设序列集合为A={a1, a2, ..., ak},其中ai表示第i个小组异或后得到的N位二进制数字。我们称一种长度为L的排列b为S的线性周期,当且仅当对于任意的i∈[1,M/L]和任意的j∈[1,k],有相等的式子:b(i) ⊕ a(j) = a(j+(i-1)×(k/L)),其中 ⊕ 表示异或操作。求最小的L。

解决方案

彼得森图问题的复杂度十分高,最初的研究者彼得森声称,该问题的解决需要使用到高斯二项式系数,因此无法求解。但后来维纳和穆夫的研究证明,该问题能够使用线性代数求解。具体方法为,使用拉格朗日内插法将问题转化为线性方程组求解。

具体算法实现请参考以下代码:

# 输入:字符串S和小组数N
# 输出:线性周期L
def peterson_graph(S, N):
    # 将字符串按照小组数N进行切分,得到子序列集合A
    A = [S[i:i + N] for i in range(0, len(S), N)]
    k = len(A)
    # 对于每个小组i,将其和后面M/N-1个小组进行异或操作,得到二进制序列集合B
    B = [[int(A[j][p]) ^ int(A[(j + i - 1) % k][p]) for p in range(N)] for j in range(k) for i in range(1, k//N+1)]
    m = len(B)
    # 构建线性方程组
    M = [[0] * m for i in range(m)]
    for i in range(m):
        for j in range(m):
            M[i][j] = B[i][j]
    # 解线性方程组,得到拉格朗日插值多项式的系数
    coef = gauss(M)
    return len(coef)

# 高斯消元求解线性方程组
def gauss(M):
    n = len(M)
    for i in range(n):
        # 高斯消元主元的选择,本算法未使用部分主元消元
        pivot = i
        for j in range(i+1, n):
            if abs(M[j][i]) > abs(M[pivot][i]):
                pivot = j
        # 交换行
        if pivot != i:
            M[i], M[pivot] = M[pivot], M[i]
        # 消元
        for j in range(i+1, n):
            c = M[j][i] / M[i][i]
            for k in range(i, n+1):
                M[j][k] -= c * M[i][k]
    # 回代求解
    coef = [0] * n
    for i in range(n-1, -1, -1):
        coef[i] = M[i][n] / M[i][i]
        for j in range(i):
            M[j][n] -= coef[i] * M[j][i]
    return coef
参考资料
  1. Kummer, E., (1864) “Ueber eine Aufgabe der indeterminaten Analysis”, Monatsberichte der Königlich Preußischen Akademie der Wissenschaften zu Berlin, 655–678.
  2. Wiener, N., (1955) “Certain notions in coding theory”, Proc. Institute of Radio Engineers, 422-–427.
  3. Hoffstein, J., Pipher, J., Silverman, J., “An Introduction to Mathematical Cryptography”, Springer, 2008.