附录4 实战
纸上得来终觉浅,绝知此事要躬行。
一、LeetCode 实战
- 力扣(LeetCode) — 全球极客挚爱的技术成长平台
- leetcode-rust — 用 Rust 刷 LeetCode 的代码仓库
- myphysics-lab — 免费在线物理模拟平台
二、相关分析与统计
协方差
总体协方差:
$$ \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$。
求解方法:
- 暴力枚举(适合小模数):从小到大试,看哪个数乘以 $a$ 模 $m$ 等于 1
- 扩展欧几里得算法(最通用):求解 $ax + my = 1$
- 费马小定理(模数是质数时):$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 尺。
七、电费查询系统实战
需求: 开发一个电费查询网站
- 提供查询电费应交、已交功能,以列表形式展示
- 提供查询单个房号累计应交、已交电费功能,以 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/)
- 三维向量的旋转、剪切、缩放
- 二维向量的旋转、剪切、缩放