Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

附录4 实战

纸上得来终觉浅,绝知此事要躬行。


一、LeetCode 实战


二、相关分析与统计

协方差

总体协方差:

$$ \text{Cov}(X, Y) = \frac{1}{n} \sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y}) $$

样本协方差:

$$ \text{Cov}(X, Y) = \frac{1}{n - 1} \sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y}) $$

皮尔逊相关系数

$$ r_{XY} = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2} \sqrt{\sum (Y_i - \bar{Y})^2}} $$

斯皮尔曼等级相关系数

用于衡量两个变量之间的单调关系(不要求线性),适用于顺序数据。

点二列相关

用于一个二分变量和一个连续变量之间的相关性分析:

from scipy.stats import pointbiserialr
x = [1,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,0,0]
y = [84,82,76,60,72,74,76,84,88,90,78,80,92,94,96,88,90,78,76,74]
corr, p_value = pointbiserialr(x, y)
print(f"corr: {corr}, p_value: {p_value}")

三、中国剩余定理

问题

《孙子算经》:今有物,不知其数。三三数之,剩二;五五数之,剩三;七七数之,剩二。问:物几何?

定理标准形式

设 $m_1, m_2, \ldots, m_k$ 两两互质,同余方程组:

$$ \begin{cases} x \equiv a_1 \pmod{m_1} \ x \equiv a_2 \pmod{m_2} \ x \equiv a_3 \pmod{m_3} \ \quad \vdots \ x \equiv a_k \pmod{m_k} \end{cases} $$

在模 $M = \prod_{i=1}^{k} m_i$ 下有唯一解。

乘法逆元

在数论中,乘法逆元特指模运算意义下的逆元:若存在整数 $b$ 使得 $a \cdot b \equiv 1 \pmod{m}$,则称 $b$ 是 $a$ 在模 $m$ 意义下的逆元。逆元存在的充要条件是 $\gcd(a, m) = 1$。

求解方法:

  1. 暴力枚举(适合小模数):从小到大试,看哪个数乘以 $a$ 模 $m$ 等于 1
  2. 扩展欧几里得算法(最通用):求解 $ax + my = 1$
  3. 费马小定理(模数是质数时):$a^{-1} \equiv a^{m-2} \pmod{m}$

扩展欧几里得算法

$$ ax + by = \gcd(a, b) $$

fn extended_gcd(a: i64, b: i64) -> (i64, i64, i64) {
    if b == 0 {
        (a, 1, 0)
    } else {
        let (gcd, x1, y1) = extended_gcd(b, a % b);
        let x = y1;
        let y = x1 - (a / b) * y1;
        (gcd, x, y)
    }
}

fn main() {
    let a = 7;
    let b = 9;
    println!("extended_gcd({}, {}) = {:?}", a, b, extended_gcd(a, b));
}

四、素数筛法

厄拉多塞筛法(埃氏筛)

fn count_primes(n: i32) -> i32 {
    if n < 2 {
        return 0;
    }
    let n_usize = n as usize;
    let mut primes = vec![true; n_usize];
    primes[0] = false;
    primes[1] = false;

    let mut count = 0;
    let limit = (n_usize as f64).sqrt() as usize;

    for i in 2..n_usize {
        if primes[i] {
            count += 1;
            if i <= limit {
                let mut j = i * i;
                while j < n_usize {
                    primes[j] = false;
                    j += i;
                }
            }
        }
    }
    count
}

fn main() {
    println!("{}", count_primes(499979));  // 41538
}

线性筛法

线性筛法可以在 O(n) 的时间复杂度内找到所有小于 n 的素数,每个合数只被其最小质因子筛掉一次。


五、最大公约数与最小公倍数

辗转相除法(欧几里得算法)

核心公式:

$$ \gcd(a, b) = \gcd(b, a \bmod b) $$

fn gcd(mut a: u64, mut b: u64) -> u64 {
    while b != 0 {
        let temp = b;
        b = a % b;
        a = temp;
    }
    a
}

fn lcm(a: u64, b: u64) -> u64 {
    a / gcd(a, b) * b  // 先除后乘,避免溢出
}

fn main() {
    println!("gcd(48, 18) = {}", gcd(48, 18));  // 6
    println!("lcm(48, 18) = {}", lcm(48, 18));  // 144
}

六、引葭赴岸

原文:今有池方一丈,葭生其中央。出水一尺,引葭赴岸,适与岸齐。问水深、葭长各几何。

有一个边长为 1 丈的正方形水池,池中央长着一根芦苇,高出水面 1 尺。将芦苇拉向岸边,其顶端刚好与水面和池岸的交点对齐。问水深和芦苇长各是多少?(1丈 = 10尺)

现代解法:设水深 $x$ 尺,则葭长 $(x+1)$ 尺

$$ x^2 + 5^2 = (x + 1)^2 $$

解得:水深 12 尺,葭长 13 尺。


七、电费查询系统实战

需求: 开发一个电费查询网站

  1. 提供查询电费应交、已交功能,以列表形式展示
  2. 提供查询单个房号累计应交、已交电费功能,以 ECharts 图表展示

数据来源: AB.xlsx

查询条件: 开始日期、结束日期、房号、应交、已交

查询结果: 日期、房号、应交、已交(按日期倒序排列)

python -m http.server 8080

http://localhost:8080/electricity_query_sqlite.html
---

## 八、同余

**定义:** 两个整数 $a$ 和 $b$ 对模数 $m$ 同余,记作 $a \equiv b \pmod{m}$。

**性质:**

- 同余的加法:若 $a \equiv b \pmod{m}$,则 $a + c \equiv b + c \pmod{m}$
- 同余的乘法:若 $a \equiv b \pmod{m}$,则 $a \times c \equiv b \times c \pmod{m}$
- 同余的幂:若 $a \equiv b \pmod{m}$,则 $a^c \equiv b^c \pmod{m}$

---

## 九、学习路径参考

- [Python 3.13.13 文档](https://docs.python.org/zh-cn/3.13/index.html)
- [《The Founder's Playbook: Building an AI-Native Startup》](https://a16z.com/)
- 三维向量的旋转、剪切、缩放
- 二维向量的旋转、剪切、缩放