#!/usr/bin/env python3
"""
给 16 立传的事实核查 + Dürer 4×4 幻方验证。

16 的关键身份:
  - 16 = 2⁴ = 4²:大于 1 的整数里最小的"既是平方数又是四次方数"
  - 真因子之和 s(16) = 1+2+4+8 = 15 —— 恰好是花园上一轮的主角
  - 全部因子之和 σ(16) = 31 = 2⁵−1 —— 第 11 个素数,也是梅森素数
    (上一轮的 15 是 2⁴−1,第一个"叛变"的梅森数;16 的 σ 却站回素数阵营)
  - d(16) = 5:16 是"恰好有 5 个因子"的最小数(p⁴ 形式,2⁴)
  - Collatz(16) = 16→8→4→2→1:纯 2 的幂滑梯,4 步到 1
  - 4×4 幻方用 1..16 排成,每行/列/对角线之和都是 34 = F₉(斐波那契)
    Dürer 1514 年的《忧郁 I》里就刻着这个幻方,底行 4 15 14 1 藏着年份 1514
"""

DURER = [
    [16, 3, 2, 13],
    [5, 10, 11, 8],
    [9, 6, 7, 12],
    [4, 15, 14, 1],
]


def divisors(n):
    return [d for d in range(1, n + 1) if n % d == 0]


def is_perfect_power(n):
    """n 能否写成 a^b(a≥2, b≥2)"""
    for a in range(2, int(n**0.5) + 1):
        b, p = 2, a * a
        while p < n:
            b += 1
            p *= a
        if p == n:
            return a, b
    return None


def collatz(n):
    seq = [n]
    while n != 1:
        n = n // 2 if n % 2 == 0 else 3 * n + 1
        seq.append(n)
    return seq


def main():
    print("== 16 的身份核查 ==")
    ds = divisors(16)
    print(f"因子: {ds}")
    print(f"d(16) = {len(ds)}")
    print(f"真因子和 s(16) = {sum(ds[:-1])}(= 15,上一轮的主角!)")
    print(f"全部因子和 σ(16) = {sum(ds)}(= 31 = 2⁵−1,第 11 个素数、梅森素数)")

    pp = is_perfect_power(16)
    assert pp is not None
    print(f"16 = {pp[0]} 的 {pp[1]} 次方 = 2⁴ = 4²,是最小的双重幂(>1 同时是平方与四次方)")

    # 验证 16 是"恰好 5 个因子"的最小数
    five = [n for n in range(1, 100) if len(divisors(n)) == 5]
    print(f"1~99 里恰好有 5 个因子的数: {five}(最小的正是 16)")

    print(f"Collatz(16): {' → '.join(map(str, collatz(16)))}(纯 2 的幂滑梯,{len(collatz(16))-1} 步)")

    print("\n== Dürer 4×4 幻方(数字 1..16,魔数 34) ==")
    for row in DURER:
        print("  ".join(f"{x:>2}" for x in row))

    n = len(DURER)
    magic = n * (n * n + 1) // 2  # 4×4 → 34
    lines = [row for row in DURER] + [[DURER[r][c] for r in range(n)] for c in range(n)]
    lines += [[DURER[i][i] for i in range(n)], [DURER[i][n - 1 - i] for i in range(n)]]
    ok = all(sum(line) == magic for line in lines)
    print(f"魔数 = 4×(4²+1)/2 = {magic}")
    print(f"全部 4 行 + 4 列 + 2 对角线共 {len(lines)} 条线,和均为 {magic}: {'✅' if ok else '❌'}")
    print(f"34 = F₉(第 9 个斐波那契数);1+2+…+16 = 136 = 4×34")
    print(f"彩蛋:底行 {DURER[3]}——15 和 14 肩并肩,正是 Dürer 刻下的年份 1514,")
    print("      也是花园前两轮立传的主角。")

    assert ok
    assert pp == (4, 2) or pp == (2, 4)
    print("\n全部断言通过 ✅")


if __name__ == "__main__":
    main()
