This commit is contained in:
Q.Sui 2026-03-05 18:30:14 +08:00
parent 646ac1a028
commit c69aec4729
79 changed files with 9297 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View File

@ -0,0 +1,26 @@
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 30, 100)
y1 = 30 - x
y2 = (100 - 4*x) / 3
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y1, 'b-', linewidth=2, label='x + y = 30')
ax.plot(x, y2, 'r-', linewidth=2, label='4x + 3y = 100')
ax.plot(10, 20, 'go', markersize=12, label='Solution (10, 20)')
ax.annotate('Tables=10, Chairs=20', xy=(10, 20), xytext=(15, 25),
arrowprops=dict(arrowstyle='->', color='green'),
fontsize=12, color='green')
ax.set_xlabel('Tables (x)', fontsize=12)
ax.set_ylabel('Chairs (y)', fontsize=12)
ax.set_title('Problem 2: Graphical Solution', fontsize=14)
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 30)
ax.set_ylim(0, 30)
plt.tight_layout()
plt.show()

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@ -0,0 +1,26 @@
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 40, 100)
y1 = 40 - x
y2 = (100 - 2*x) / 4
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y1, 'b-', linewidth=2, label='x + y = 40')
ax.plot(x, y2, 'r-', linewidth=2, label='2x + 4y = 100')
ax.plot(30, 10, 'go', markersize=12, label='Solution (30, 10)')
ax.annotate('Chicken=30, Rabbit=10', xy=(30, 10), xytext=(20, 20),
arrowprops=dict(arrowstyle='->', color='green'),
fontsize=12, color='green')
ax.set_xlabel('Chicken (x)', fontsize=12)
ax.set_ylabel('Rabbit (y)', fontsize=12)
ax.set_title('Problem 1: Graphical Solution', fontsize=14)
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 40)
ax.set_ylim(0, 40)
plt.tight_layout()
plt.show()

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
_images/chiken_rabbit-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
_images/chiken_rabbit-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@ -0,0 +1,493 @@
鸡兔同笼问题
======================
第一部分:故事引入
------------------
农场里有一个笼子,里面关着鸡和兔。农夫数了数,发现笼子里共有 35 个头, 94 只脚。农夫很困惑:到底有多少只鸡,多少只兔呢?请你来帮忙!
**问题场景**
.. mermaid::
flowchart LR
A[农夫观察笼子] --> B[数头: 35个]
A --> C[数脚: 94只]
**求解目标**
.. mermaid::
flowchart LR
D[? 多少只鸡] --> E[需要方法求解]
F[? 多少只兔] --> E
第二部分:直观观察
------------------
动物特征对比
~~~~~~~~~~~~
.. list-table::
:header-rows: 1
* - 动物
- 头数
- 脚数
* - 鸡
- 1
- 2
* - 兔
- 1
- 4
已知条件与目标
~~~~~~~~~~~~~~
.. mermaid::
flowchart LR
H[头数=35] --> X[求: 鸡数x]
F[脚数=94] --> Y[求: 兔数y]
关系梳理:
- 鸡有 2 条腿,兔有 4 条腿
- 头数总和: 35(每只动物一个头)
- 脚数总和: 94
- 我们需要找到鸡和兔的数量
第三部分:解法一(假设法,适合低年级)
--------------------------------------
核心思路
~~~~~~~~
.. mermaid::
flowchart LR
A[假设全是鸡] --> B[计算脚数差]
B --> C[求出兔数]
C --> D[求出鸡数]
详细步骤
~~~~~~~~
**步骤1: 假设全是鸡**
.. mermaid::
flowchart LR
A[35只全是鸡] --> B["脚数 = 35*2 = 70"]
.. math::
35 \times 2 = 70 \quad \text{只脚}
**步骤2: 发现差距**
.. mermaid::
flowchart LR
A[假设: 70只脚] --> C[差额: 24只脚]
B[实际: 94只脚] --> C
实际脚数是 94, 比假设多:
.. math::
94 - 70 = 24
**步骤3: 修正假设**
.. mermaid::
flowchart LR
A[差额 24 只脚] --> B[每兔多 2 只脚]
B --> C["兔数 = 24/2 = 12"]
C --> D["鸡数 = 35-12 = 23"]
每只兔比鸡多 2 条腿,因此兔的数量为:
.. math::
\frac{24}{2} = 12
所以鸡的数量为:
.. math::
35 - 12 = 23
**步骤4: 验证结果**
.. mermaid::
flowchart LR
A["鸡: 23*2 = 46脚"] --> C[总计: 94脚]
B["兔: 12*4 = 48脚"] --> C
验证: 12 * 4 + 23 * 2 = 48 + 46 = 94 (正确)
第四部分:解法二(代入法,适合中年级)
--------------------------------------
核心思路
~~~~~~~~
.. mermaid::
flowchart LR
A[设鸡x, 兔y] --> B[由头数得y=35-x]
B --> C[代入脚数方程]
C --> D[求解x, y]
详细步骤
~~~~~~~~
设鸡为 :math:`x`,兔为 :math:`y`。
**步骤1: 建立关系**
.. mermaid::
flowchart LR
A["x + y = 35"] --> B["y = 35 - x"]
B --> C[代入方程2]
由头数方程:
.. math::
y = 35 - x
**步骤2: 代入求解**
.. mermaid::
flowchart TD
A["2x + 4(35-x) = 94"]
B["-2x = -46"]
C["x = 23, y = 12"]
A --> B --> C
代入脚数方程:
.. math::
2x + 4(35 - x) = 94
化简:
.. math::
-2x + 140 = 94 \\
-2x = -46 \\
x = 23
所以 :math:`y = 35 - 23 = 12`
第五部分:解法三(方程法,适合高年级)
--------------------------------------
核心思路
~~~~~~~~
.. mermaid::
flowchart LR
A[建立方程组] --> B[选择解法]
B --> C[代入法/消元法]
C --> D[求解答案]
详细步骤
~~~~~~~~
建立方程组:
.. math::
\begin{cases}
x + y = 35 \\
2x + 4y = 94
\end{cases}
**方法一:代入法**
.. mermaid::
flowchart LR
A["x = 35-y"] --> B["代入第二式"]
B --> C["y = 12, x = 23"]
**方法二:消元法**
.. mermaid::
flowchart LR
A["方程1 x2"] --> B["相减消元"]
B --> C["y = 12"]
C --> D["x = 23"]
答案:鸡 23 只,兔 12 只
第六部分:方法比较
------------------
方法对比
~~~~~~~~
.. list-table::
:header-rows: 1
* - 方法
- 特点
- 适合年级
* - 假设法
- 直观易懂
- 低年级
* - 代入法
- 步骤清晰
- 中年级
* - 方程法
- 系统严谨
- 高年级
殊途同归
~~~~~~~~
.. mermaid::
flowchart LR
A[假设法] --> D[答案: 鸡23, 兔12]
B[代入法] --> D
C[方程法] --> D
第七部分:互动练习
------------------
题 1: 鸡兔同笼问题(变式)
~~~~~~~~~~~~~~~~~~~~~~~~~
**已知条件**
.. mermaid::
flowchart LR
A[头数: 40] --> C[求: 鸡? 兔?]
B[脚数: 100] --> C
.. math::
\begin{cases}
x + y = 40 \\
2x + 4y = 100
\end{cases}
.. plot::
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 40, 100)
y1 = 40 - x
y2 = (100 - 2*x) / 4
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y1, 'b-', linewidth=2, label='x + y = 40')
ax.plot(x, y2, 'r-', linewidth=2, label='2x + 4y = 100')
ax.plot(30, 10, 'go', markersize=12, label='Solution (30, 10)')
ax.annotate('Chicken=30, Rabbit=10', xy=(30, 10), xytext=(20, 20),
arrowprops=dict(arrowstyle='->', color='green'),
fontsize=12, color='green')
ax.set_xlabel('Chicken (x)', fontsize=12)
ax.set_ylabel('Rabbit (y)', fontsize=12)
ax.set_title('Problem 1: Graphical Solution', fontsize=14)
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 40)
ax.set_ylim(0, 40)
plt.tight_layout()
plt.show()
答案:鸡 30 只,兔 10 只
题 2: 桌椅问题
~~~~~~~~~~~~~
**已知条件**
.. mermaid::
flowchart LR
A[桌子: 4腿] --> C[求: 桌子?]
B[椅子: 3腿] --> D[求: 椅子?]
E[总数: 30件] --> C
F[总腿: 100] --> D
.. math::
\begin{cases}
x + y = 30 \\
4x + 3y = 100
\end{cases}
.. plot::
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 30, 100)
y1 = 30 - x
y2 = (100 - 4*x) / 3
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y1, 'b-', linewidth=2, label='x + y = 30')
ax.plot(x, y2, 'r-', linewidth=2, label='4x + 3y = 100')
ax.plot(10, 20, 'go', markersize=12, label='Solution (10, 20)')
ax.annotate('Tables=10, Chairs=20', xy=(10, 20), xytext=(15, 25),
arrowprops=dict(arrowstyle='->', color='green'),
fontsize=12, color='green')
ax.set_xlabel('Tables (x)', fontsize=12)
ax.set_ylabel('Chairs (y)', fontsize=12)
ax.set_title('Problem 2: Graphical Solution', fontsize=14)
ax.legend(loc='upper right')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 30)
ax.set_ylim(0, 30)
plt.tight_layout()
plt.show()
答案:桌子 10 张,椅子 20 把
题 3: 铅笔和钢笔问题
~~~~~~~~~~~~~~~~~~~
**已知条件**
.. mermaid::
flowchart LR
A[铅笔: 1元/支] --> C[求: 铅笔?]
B[钢笔: 3元/支] --> D[求: 钢笔?]
E[总数: 40支] --> C
F[总价: 80元] --> D
.. math::
\begin{cases}
x + y = 40 \\
x + 3y = 80
\end{cases}
答案:铅笔 20 支,钢笔 20 支
题 4: 公交车和小汽车问题
~~~~~~~~~~~~~~~~~~~~~~~
**已知条件**
.. mermaid::
flowchart LR
A[公交: 40轮] --> C[求: 公交?]
B[汽车: 4轮] --> D[求: 汽车?]
E[总数: 20辆] --> C
F[总轮: 296] --> D
.. math::
\begin{cases}
x + y = 20 \\
40x + 4y = 296
\end{cases}
答案:公交车 6 辆,小汽车 14 辆
题 5: 鸡兔鸭同笼问题(进阶)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
**已知条件**
.. mermaid::
flowchart LR
A[鸡: 2腿] --> D[求: 鸡?]
B[兔: 4腿] --> E[求: 兔?]
C[鸭: 2腿] --> F[求: 鸭?]
G[总数: 60只] --> D
H[总腿: 160] --> E
I[鸡比鸭多10只] --> F
.. math::
\begin{cases}
x + y + z = 60 \\
2x + 4y + 2z = 160 \\
x - z = 10
\end{cases
答案:鸡 25 只,兔 20 只,鸭 15 只
第八部分:小结
--------------
知识结构
~~~~~~~~
.. mermaid::
flowchart TB
A[鸡兔同笼问题] --> B[假设法]
A --> C[代入法]
A --> D[方程法]
解题步骤
~~~~~~~~
.. mermaid::
flowchart LR
A[分析问题] --> B[选择方法]
B --> C[求解]
C --> D[验证答案]
要点总结
~~~~~~~~
1. 鸡兔同笼问题是典型的应用题,核心是找到头数和腿数的关系
2. 三种解法各有优劣
3. 数学的魅力在于不同路径可以通向同一个答案
4. 解题后要验证结果
思考题
------
如果笼子里有若干只蜘蛛8条腿、蜻蜓6条腿和蝉6条腿共 20 只,总共 130 条腿。已知蜘蛛比蝉多 1 只。问每种昆虫各有多少只?
**已知条件**
.. mermaid::
flowchart LR
A[蜘蛛: 8腿] --> D[求: 蜘蛛?]
B[蜻蜓: 6腿] --> E[求: 蜻蜓?]
C[蝉: 6腿] --> F[求: 蝉?]
G[总数: 20只] --> D
H[总腿: 130] --> E
I[蜘蛛=蝉+1] --> F
**解题提示**
.. mermaid::
flowchart LR
A[设蝉为z只] --> B[蜘蛛=z+1只]
B --> C[蜻蜓=19-2z只]
C --> D[列腿数方程求解]

456
_sources/gcd_lcm.rst.txt Normal file
View File

@ -0,0 +1,456 @@
最大公约数与最小公倍数
======================
第一部分:故事引入
------------------
小明要给班级的图书角买书。他发现如果每6本一包正好包完如果每8本一包也正好包完。小明至少买了多少本书
**问题场景**
.. mermaid::
flowchart LR
A[买书问题] --> B[6本一包: 正好包完]
A --> C[8本一包: 正好包完]
**求解目标**
.. mermaid::
flowchart LR
D[求: 至少买多少本?] --> E[需要方法求解]
第二部分:直观观察
------------------
基本概念
~~~~~~~~
.. list-table::
:header-rows: 1
* - 概念
- 定义
- 符号
* - 最大公约数
- 两个数公有的约数中最大的一个
- GCD
* - 最小公倍数
- 两个数公有的倍数中最小的一个
- LCM
约数与倍数关系
~~~~~~~~~~~~~~
.. mermaid::
flowchart LR
A[数a] --> B[约数: 能整除a的数]
A --> C[倍数: a的整数倍]
以6和8为例
- 6的约数1, 2, 3, 6
- 8的约数1, 2, 4, 8
- 6和8的公约数1, 2
- 6和8的最大公约数2
- 6的倍数6, 12, 18, 24, 30, ...
- 8的倍数8, 16, 24, 32, ...
- 6和8的公倍数24, 48, 72, ...
- 6和8的最小公倍数24
第三部分:解法一(列举法,适合低年级)
--------------------------------------
核心思路
~~~~~~~~
.. mermaid::
flowchart LR
A[列举约数/倍数] --> B[找公共的]
B --> C[选最大/最小]
求最大公约数步骤
~~~~~~~~~~~~~~~~
**例求18和24的最大公约数**
**步骤1: 列举约数**
.. mermaid::
flowchart LR
A[18的约数] --> B[1, 2, 3, 6, 9, 18]
C[24的约数] --> D[1, 2, 3, 4, 6, 8, 12, 24]
**步骤2: 找公约数**
.. mermaid::
flowchart LR
A[公约数] --> B[1, 2, 3, 6]
**步骤3: 选最大的**
.. mermaid::
flowchart LR
A[最大公约数] --> B[GCD = 6]
求最小公倍数步骤
~~~~~~~~~~~~~~~~
**例求18和24的最小公倍数**
**步骤1: 列举倍数**
.. mermaid::
flowchart LR
A[18的倍数] --> B[18, 36, 54, 72, 90, ...]
C[24的倍数] --> D[24, 48, 72, 96, ...]
**步骤2: 找公倍数**
.. mermaid::
flowchart LR
A[公倍数] --> B[72, 144, ...]
**步骤3: 选最小的**
.. mermaid::
flowchart LR
A[最小公倍数] --> B[LCM = 72]
第四部分:解法二(短除法,适合中年级)
--------------------------------------
核心思路
~~~~~~~~
.. mermaid::
flowchart LR
A[用公因数连续除] --> B[直到互质为止]
B --> C[计算结果]
求最大公约数
~~~~~~~~~~~~
**例求18和24的最大公约数**
.. mermaid::
flowchart TD
A["2 | 18 24"]
B["3 | 9 12"]
C[" | 3 4"]
A --> B --> C
计算过程:
::
2 | 18 24
---------
3 | 9 12
---------
3 4
最大公约数 = 2 × 3 = 6
求最小公倍数
~~~~~~~~~~~~
**例求18和24的最小公倍数**
使用相同的短除过程:
最小公倍数 = 2 × 3 × 3 × 4 = 72
.. mermaid::
flowchart LR
A["GCD = 所有除数的积"] --> B["GCD = 2*3 = 6"]
C["LCM = 所有数的积"] --> D["LCM = 2*3*3*4 = 72"]
第五部分:解法三(质因数分解法,适合高年级)
--------------------------------------------
核心思路
~~~~~~~~
.. mermaid::
flowchart LR
A[分解质因数] --> B[提取公共部分]
B --> C[计算结果]
分解质因数
~~~~~~~~~~
**例求18和24的GCD和LCM**
**步骤1: 分解质因数**
.. mermaid::
flowchart LR
A["18 = 2 * 3 * 3"]
B["24 = 2 * 2 * 2 * 3"]
**步骤2: 求GCD**
.. mermaid::
flowchart LR
A[取公共质因数的最低次幂] --> B["GCD = 2^1 * 3^1 = 6"]
**步骤3: 求LCM**
.. mermaid::
flowchart LR
A[取所有质因数的最高次幂] --> B["LCM = 2^3 * 3^2 = 72"]
重要关系
~~~~~~~~
.. mermaid::
flowchart TD
A["GCD(a,b) * LCM(a,b) = a * b"]
style A fill:#e8f5e9
验证GCD(18,24) × LCM(18,24) = 6 × 72 = 432 = 18 × 24 ✓
第六部分:方法比较
------------------
方法对比
~~~~~~~~
.. list-table::
:header-rows: 1
* - 方法
- 特点
- 适合年级
* - 列举法
- 直观易懂,适合小数
- 低年级
* - 短除法
- 计算简便,常用方法
- 中年级
* - 质因数分解
- 理论清晰,适合大数
- 高年级
方法选择
~~~~~~~~
.. mermaid::
flowchart TD
A[求GCD/LCM] --> B{数字大小}
B -->|小| C[列举法]
B -->|中| D[短除法]
B -->|大| E[质因数分解]
第七部分:互动练习
------------------
题 1: 基础题
~~~~~~~~~~~~
**已知条件**
.. mermaid::
flowchart LR
A[求12和18] --> B[GCD = ?]
A --> C[LCM = ?]
**解答过程**
.. mermaid::
flowchart LR
A["12 = 2*2*3"] --> C["GCD = 2*3 = 6"]
B["18 = 2*3*3"] --> D["LCM = 2*2*3*3 = 36"]
答案GCD(12,18) = 6LCM(12,18) = 36
题 2: 应用题(分糖果)
~~~~~~~~~~~~~~~~~~~~~
**题目**
小明有12颗糖果小红有18颗糖果。要把它们分别装进袋子里每袋数量相同且最多每袋装几颗
**已知条件**
.. mermaid::
flowchart LR
A[小明: 12颗] --> C[求: 每袋最多?]
B[小红: 18颗] --> C
**分析**
.. mermaid::
flowchart LR
A[每袋数量相同] --> C[求GCD]
B[每袋最多] --> C
C --> D["GCD(12,18) = 6"]
答案每袋最多装6颗
题 3: 应用题(发车问题)
~~~~~~~~~~~~~~~~~~~~~~~~~~
**题目**
公交A线每12分钟发一班车公交B线每18分钟发一班车。两车同时发车后至少多少分钟再次同时发车
**已知条件**
.. mermaid::
flowchart LR
A[A线: 12分钟] --> C[求: 至少多久?]
B[B线: 18分钟] --> C
**分析**
.. mermaid::
flowchart LR
A[再次同时发车] --> C[求LCM]
B[至少] --> C
C --> D["LCM(12,18) = 36"]
答案至少36分钟后再次同时发车
题 4: 进阶题
~~~~~~~~~~~~
**题目**
求三个数12、18、24的最大公约数和最小公倍数。
**已知条件**
.. mermaid::
flowchart LR
A[12, 18, 24] --> B[GCD = ?]
A --> C[LCM = ?]
**解答过程**
.. mermaid::
flowchart LR
A["12 = 2*2*3"] --> D["GCD = 2*3 = 6"]
B["18 = 2*3*3"] --> E["LCM = 2*2*2*3*3 = 72"]
C["24 = 2*2*2*3"]
答案GCD(12,18,24) = 6LCM(12,18,24) = 72
题 5: 综合应用题
~~~~~~~~~~~~~~~~
**题目**
一个长方形操场长72米宽48米。要在四周插彩旗要求四角都插且相邻两面彩旗之间的距离相等。最少需要插多少面彩旗
**已知条件**
.. mermaid::
flowchart LR
A[长: 72米] --> C[求: 最少几面?]
B[宽: 48米] --> C
**分析**
.. mermaid::
flowchart LR
A[距离相等] --> C[求GCD]
B[最少] --> C
C --> D["GCD(72,48) = 24"]
D --> E["周长/间隔 = (72+48)*2/24 = 10"]
答案最少需要插10面彩旗
第八部分:小结
--------------
知识结构
~~~~~~~~
.. mermaid::
flowchart TB
A[GCD与LCM] --> B[列举法]
A --> C[短除法]
A --> D[质因数分解]
重要公式
~~~~~~~~
.. mermaid::
flowchart TD
A["GCD(a,b) * LCM(a,b) = a * b"]
style A fill:#fff3e0
解题步骤
~~~~~~~~
.. mermaid::
flowchart LR
A[分析问题] --> B[判断求GCD还是LCM]
B --> C[选择方法]
C --> D[计算验证]
要点总结
~~~~~~~~
1. 最大公约数用于"最多"、"最长"等问题
2. 最小公倍数用于"至少"、"最少"等问题
3. 短除法是最常用的方法
4. 记住重要关系GCD × LCM = 两数之积
思考题
------
一个房间长240厘米宽180厘米。要用正方形地砖铺地要求地砖尽可能大且正好铺满。需要多少块地砖每块地砖的面积是多少
**已知条件**
.. mermaid::
flowchart LR
A[长: 240厘米] --> C[求: 地砖数量?]
B[宽: 180厘米] --> D[求: 每块面积?]
**解题提示**
.. mermaid::
flowchart LR
A[正方形地砖] --> C[边长 = GCD]
B[尽可能大] --> C
C --> D["GCD(240,180) = 60"]
D --> E["数量 = 240*180/(60*60) = 12"]

14
_sources/index.rst.txt Normal file
View File

@ -0,0 +1,14 @@
.. class_boru documentation master file, created by
sphinx-quickstart on Thu Mar 5 10:06:38 2026.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Class Boru
========================
.. toctree::
:maxdepth: 2
:caption: Contents:
chiken_rabbit
gcd_lcm

View File

@ -0,0 +1,123 @@
/* Compatability shim for jQuery and underscores.js.
*
* Copyright Sphinx contributors
* Released under the two clause BSD licence
*/
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

906
_static/basic.css Normal file
View File

@ -0,0 +1,906 @@
/*
* Sphinx stylesheet -- basic theme.
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
div.section::after {
display: block;
content: '';
clear: left;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin-top: 10px;
}
ul.search li {
padding: 5px 0;
}
ul.search li a {
font-weight: bold;
}
ul.search li p.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 360px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
a:visited {
color: #551A8B;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, figure.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, figure.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, figure.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, figure.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar,
aside.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
clear: right;
overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
nav.contents,
aside.topic,
div.admonition, div.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
nav.contents,
aside.topic,
div.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child,
aside.sidebar > :last-child,
nav.contents > :last-child,
aside.topic > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
}
div.sidebar::after,
aside.sidebar::after,
nav.contents::after,
aside.topic::after,
div.topic::after,
div.admonition::after,
blockquote::after {
display: block;
content: '';
clear: both;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
margin-top: 10px;
margin-bottom: 10px;
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > :first-child,
td > :first-child {
margin-top: 0px;
}
th > :last-child,
td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure, figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption, figcaption {
padding: 0.3em;
}
div.figure p.caption span.caption-number,
figcaption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text,
figcaption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist {
margin: 1em 0;
}
table.hlist td {
vertical-align: top;
}
/* -- object description styles --------------------------------------------- */
.sig {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
}
.sig-name, code.descname {
background-color: transparent;
font-weight: bold;
}
.sig-name {
font-size: 1.1em;
}
code.descname {
font-size: 1.2em;
}
.sig-prename, code.descclassname {
background-color: transparent;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.sig-param.n {
font-style: italic;
}
/* C++ specific styling */
.sig-inline.c-texpr,
.sig-inline.cpp-texpr {
font-family: unset;
}
.sig.c .k, .sig.c .kt,
.sig.cpp .k, .sig.cpp .kt {
color: #0033B3;
}
.sig.c .m,
.sig.cpp .m {
color: #1750EB;
}
.sig.c .s, .sig.c .sc,
.sig.cpp .s, .sig.cpp .sc {
color: #067D17;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
:not(li) > ol > li:first-child > :first-child,
:not(li) > ul > li:first-child > :first-child {
margin-top: 0px;
}
:not(li) > ol > li:last-child > :last-child,
:not(li) > ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol.simple ol p,
ol.simple ul p,
ul.simple ol p,
ul.simple ul p {
margin-top: 0;
}
ol.simple > li:not(:first-child) > p,
ul.simple > li:not(:first-child) > p {
margin-top: 0;
}
ol.simple p,
ul.simple p {
margin-bottom: 0;
}
aside.footnote > span,
div.citation > span {
float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em;
}
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > :first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
.sig dd {
margin-top: 0px;
margin-bottom: 0px;
}
.sig dl {
margin-top: 0px;
margin-bottom: 0px;
}
dl > dd:last-child,
dl > dd:last-child > :last-child {
margin-bottom: 0;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0 0.5em;
content: ":";
display: inline-block;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
pre, div[class*="highlight-"] {
clear: both;
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
white-space: nowrap;
}
div[class*="highlight-"] {
margin: 1em 0;
}
td.linenos pre {
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
display: block;
}
table.highlighttable tbody {
display: block;
}
table.highlighttable tr {
display: flex;
}
table.highlighttable td {
margin: 0;
padding: 0;
}
table.highlighttable td.linenos {
padding-right: 0.5em;
}
table.highlighttable td.code {
flex: 1;
overflow: hidden;
}
.highlight .hll {
display: block;
}
div.highlight pre,
table.highlighttable pre {
margin: 0;
}
div.code-block-caption + div {
margin-top: 0;
}
div.code-block-caption {
margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
table.highlighttable td.linenos,
span.linenos,
div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none;
-webkit-user-select: text; /* Safari fallback only */
-webkit-user-select: none; /* Chrome/Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+ */
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
margin: 1em 0;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: absolute;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

View File

@ -0,0 +1 @@
.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

4
_static/css/theme.css Normal file

File diff suppressed because one or more lines are too long

149
_static/doctools.js Normal file
View File

@ -0,0 +1,149 @@
/*
* Base JavaScript utilities for all Sphinx HTML documentation.
*/
"use strict";
const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([
"TEXTAREA",
"INPUT",
"SELECT",
"BUTTON",
]);
const _ready = (callback) => {
if (document.readyState !== "loading") {
callback();
} else {
document.addEventListener("DOMContentLoaded", callback);
}
};
/**
* Small JavaScript module for the documentation.
*/
const Documentation = {
init: () => {
Documentation.initDomainIndexTable();
Documentation.initOnKeyListeners();
},
/**
* i18n support
*/
TRANSLATIONS: {},
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext: (string) => {
const translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) {
case "undefined":
return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
},
ngettext: (singular, plural, n) => {
const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated !== "undefined")
return translated[Documentation.PLURAL_EXPR(n)];
return n === 1 ? singular : plural;
},
addTranslations: (catalog) => {
Object.assign(Documentation.TRANSLATIONS, catalog.messages);
Documentation.PLURAL_EXPR = new Function(
"n",
`return (${catalog.plural_expr})`
);
Documentation.LOCALE = catalog.locale;
},
/**
* helper function to focus on search bar
*/
focusSearchBar: () => {
document.querySelectorAll("input[name=q]")[0]?.focus();
},
/**
* Initialise the domain index toggle buttons
*/
initDomainIndexTable: () => {
const toggler = (el) => {
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
},
initOnKeyListeners: () => {
// only install a listener if it is really needed
if (
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
)
return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.altKey || event.ctrlKey || event.metaKey) return;
if (!event.shiftKey) {
switch (event.key) {
case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const prevLink = document.querySelector('link[rel="prev"]');
if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) {
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
event.preventDefault();
}
});
},
};
// quick alias for translations
const _ = Documentation.gettext;
_ready(Documentation.init);

View File

@ -0,0 +1,13 @@
const DOCUMENTATION_OPTIONS = {
VERSION: '',
LANGUAGE: 'zh',
COLLAPSE_INDEX: false,
BUILDER: 'html',
FILE_SUFFIX: '.html',
LINK_SUFFIX: '.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
};

BIN
_static/file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 286 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
_static/jquery.js vendored Normal file

File diff suppressed because one or more lines are too long

1
_static/js/badge_only.js Normal file
View File

@ -0,0 +1 @@
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}});

1
_static/js/theme.js Normal file

File diff suppressed because one or more lines are too long

228
_static/js/versions.js Normal file
View File

@ -0,0 +1,228 @@
const themeFlyoutDisplay = "hidden";
const themeVersionSelector = true;
const themeLanguageSelector = true;
if (themeFlyoutDisplay === "attached") {
function renderLanguages(config) {
if (!config.projects.translations.length) {
return "";
}
// Insert the current language to the options on the selector
let languages = config.projects.translations.concat(config.projects.current);
languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name));
const languagesHTML = `
<dl>
<dt>Languages</dt>
${languages
.map(
(translation) => `
<dd ${translation.slug == config.projects.current.slug ? 'class="rtd-current-item"' : ""}>
<a href="${translation.urls.documentation}">${translation.language.code}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return languagesHTML;
}
function renderVersions(config) {
if (!config.versions.active.length) {
return "";
}
const versionsHTML = `
<dl>
<dt>版本</dt>
${config.versions.active
.map(
(version) => `
<dd ${version.slug === config.versions.current.slug ? 'class="rtd-current-item"' : ""}>
<a href="${version.urls.documentation}">${version.slug}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return versionsHTML;
}
function renderDownloads(config) {
if (!Object.keys(config.versions.current.downloads).length) {
return "";
}
const downloadsNameDisplay = {
pdf: "PDF",
epub: "Epub",
htmlzip: "HTML",
};
const downloadsHTML = `
<dl>
<dt>下载</dt>
${Object.entries(config.versions.current.downloads)
.map(
([name, url]) => `
<dd>
<a href="${url}">${downloadsNameDisplay[name]}</a>
</dd>
`,
)
.join("\n")}
</dl>
`;
return downloadsHTML;
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
const config = event.detail.data();
const flyout = `
<div class="rst-versions" data-toggle="rst-versions" role="note">
<span class="rst-current-version" data-toggle="rst-current-version">
<span class="fa fa-book"> Read the Docs</span>
v: ${config.versions.current.slug}
<span class="fa fa-caret-down"></span>
</span>
<div class="rst-other-versions">
<div class="injected">
${renderLanguages(config)}
${renderVersions(config)}
${renderDownloads(config)}
<dl>
<dt>托管于 Read the Docs</dt>
<dd>
<a href="${config.projects.current.urls.home}">项目主页</a>
</dd>
<dd>
<a href="${config.projects.current.urls.builds}">构建</a>
</dd>
<dd>
<a href="${config.projects.current.urls.downloads}">下载</a>
</dd>
</dl>
<dl>
<dt>搜索</dt>
<dd>
<form id="flyout-search-form">
<input
class="wy-form"
type="text"
name="q"
aria-label="搜索文档"
placeholder="搜索文档"
/>
</form>
</dd>
</dl>
<hr />
<small>
<span>Hosted by <a href="https://about.readthedocs.org/?utm_source=&utm_content=flyout">Read the Docs</a></span>
</small>
</div>
</div>
`;
// Inject the generated flyout into the body HTML element.
document.body.insertAdjacentHTML("beforeend", flyout);
// Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout.
document
.querySelector("#flyout-search-form")
.addEventListener("focusin", () => {
const event = new CustomEvent("readthedocs-search-show");
document.dispatchEvent(event);
});
})
}
if (themeLanguageSelector || themeVersionSelector) {
function onSelectorSwitch(event) {
const option = event.target.selectedIndex;
const item = event.target.options[option];
window.location.href = item.dataset.url;
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
const config = event.detail.data();
const versionSwitch = document.querySelector(
"div.switch-menus > div.version-switch",
);
if (themeVersionSelector) {
let versions = config.versions.active;
if (config.versions.current.hidden || config.versions.current.type === "external") {
versions.unshift(config.versions.current);
}
const versionSelect = `
<select>
${versions
.map(
(version) => `
<option
value="${version.slug}"
${config.versions.current.slug === version.slug ? 'selected="selected"' : ""}
data-url="${version.urls.documentation}">
${version.slug}
</option>`,
)
.join("\n")}
</select>
`;
versionSwitch.innerHTML = versionSelect;
versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
}
const languageSwitch = document.querySelector(
"div.switch-menus > div.language-switch",
);
if (themeLanguageSelector) {
if (config.projects.translations.length) {
// Add the current language to the options on the selector
let languages = config.projects.translations.concat(
config.projects.current,
);
languages = languages.sort((a, b) =>
a.language.name.localeCompare(b.language.name),
);
const languageSelect = `
<select>
${languages
.map(
(language) => `
<option
value="${language.language.code}"
${config.projects.current.slug === language.slug ? 'selected="selected"' : ""}
data-url="${language.urls.documentation}">
${language.language.name}
</option>`,
)
.join("\n")}
</select>
`;
languageSwitch.innerHTML = languageSelect;
languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);
}
else {
languageSwitch.remove();
}
}
});
}
document.addEventListener("readthedocs-addons-data-ready", function (event) {
// Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav.
document
.querySelector("[role='search'] input")
.addEventListener("focusin", () => {
const event = new CustomEvent("readthedocs-search-show");
document.dispatchEvent(event);
});
});

192
_static/language_data.js Normal file
View File

@ -0,0 +1,192 @@
/*
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*/
var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
/* Non-minified version is copied as a separate JS file, if available */
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}

BIN
_static/minus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

View File

@ -0,0 +1,16 @@
/*
* plot_directive.css
* ~~~~~~~~~~~~
*
* Stylesheet controlling images created using the `plot` directive within
* Sphinx.
*
* :copyright: Copyright 2020-* by the Matplotlib development team.
* :license: Matplotlib, see LICENSE for details.
*
*/
img.plot-directive {
border: 0;
max-width: 100%;
}

BIN
_static/plus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 B

75
_static/pygments.css Normal file
View File

@ -0,0 +1,75 @@
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #F00 } /* Error */
.highlight .k { color: #008000; font-weight: bold } /* Keyword */
.highlight .o { color: #666 } /* Operator */
.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #9C6500 } /* Comment.Preproc */
.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */
.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #E40000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #008400 } /* Generic.Inserted */
.highlight .go { color: #717171 } /* Generic.Output */
.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #04D } /* Generic.Traceback */
.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008000 } /* Keyword.Pseudo */
.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #B00040 } /* Keyword.Type */
.highlight .m { color: #666 } /* Literal.Number */
.highlight .s { color: #BA2121 } /* Literal.String */
.highlight .na { color: #687822 } /* Name.Attribute */
.highlight .nb { color: #008000 } /* Name.Builtin */
.highlight .nc { color: #00F; font-weight: bold } /* Name.Class */
.highlight .no { color: #800 } /* Name.Constant */
.highlight .nd { color: #A2F } /* Name.Decorator */
.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #00F } /* Name.Function */
.highlight .nl { color: #767600 } /* Name.Label */
.highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #19177C } /* Name.Variable */
.highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */
.highlight .w { color: #BBB } /* Text.Whitespace */
.highlight .mb { color: #666 } /* Literal.Number.Bin */
.highlight .mf { color: #666 } /* Literal.Number.Float */
.highlight .mh { color: #666 } /* Literal.Number.Hex */
.highlight .mi { color: #666 } /* Literal.Number.Integer */
.highlight .mo { color: #666 } /* Literal.Number.Oct */
.highlight .sa { color: #BA2121 } /* Literal.String.Affix */
.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */
.highlight .sc { color: #BA2121 } /* Literal.String.Char */
.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */
.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #BA2121 } /* Literal.String.Double */
.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */
.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */
.highlight .sx { color: #008000 } /* Literal.String.Other */
.highlight .sr { color: #A45A77 } /* Literal.String.Regex */
.highlight .s1 { color: #BA2121 } /* Literal.String.Single */
.highlight .ss { color: #19177C } /* Literal.String.Symbol */
.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #00F } /* Name.Function.Magic */
.highlight .vc { color: #19177C } /* Name.Variable.Class */
.highlight .vg { color: #19177C } /* Name.Variable.Global */
.highlight .vi { color: #19177C } /* Name.Variable.Instance */
.highlight .vm { color: #19177C } /* Name.Variable.Magic */
.highlight .il { color: #666 } /* Literal.Number.Integer.Long */

635
_static/searchtools.js Normal file
View File

@ -0,0 +1,635 @@
/*
* Sphinx JavaScript utilities for the full-text search.
*/
"use strict";
/**
* Simple result scoring code.
*/
if (typeof Scorer === "undefined") {
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [docname, title, anchor, descr, score, filename]
// and returns the new score.
/*
score: result => {
const [docname, title, anchor, descr, score, filename, kind] = result
return score
},
*/
// query matches the full name of an object
objNameMatch: 11,
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {
0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping.
objPrioDefault: 0,
// query found in title
title: 15,
partialTitle: 7,
// query found in terms
term: 5,
partialTerm: 2,
};
}
// Global search result kind enum, used by themes to style search results.
class SearchResultKind {
static get index() { return "index"; }
static get object() { return "object"; }
static get text() { return "text"; }
static get title() { return "title"; }
}
const _removeChildren = (element) => {
while (element && element.lastChild) element.removeChild(element.lastChild);
};
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
const _displayItem = (item, searchTerms, highlightTerms) => {
const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
const contentRoot = document.documentElement.dataset.content_root;
const [docName, title, anchor, descr, score, _filename, kind] = item;
let listItem = document.createElement("li");
// Add a class representing the item's type:
// can be used by a theme's CSS selector for styling
// See SearchResultKind for the class names.
listItem.classList.add(`kind-${kind}`);
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = contentRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = contentRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
}
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + anchor;
linkEl.dataset.score = score;
linkEl.innerHTML = title;
if (descr) {
listItem.appendChild(document.createElement("span")).innerHTML =
" (" + descr + ")";
// highlight search terms in the description
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
}
else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms, anchor)
);
// highlight search terms in the summary
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted"));
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
);
else
Search.status.innerText = Documentation.ngettext(
"Search finished, found one page matching the search query.",
"Search finished, found ${resultCount} pages matching the search query.",
resultCount,
).replace('${resultCount}', resultCount);
};
const _displayNextItem = (
results,
resultCount,
searchTerms,
highlightTerms,
) => {
// results left, load the summary and display it
// this is intended to be dynamic (don't sub resultsCount)
if (results.length) {
_displayItem(results.pop(), searchTerms, highlightTerms);
setTimeout(
() => _displayNextItem(results, resultCount, searchTerms, highlightTerms),
5
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
// Helper function used by query() to order search results.
// Each input is an array of [docname, title, anchor, descr, score, filename, kind].
// Order the results by score (in opposite order of appearance, since the
// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
const _orderResultsByScoreThenName = (a, b) => {
const leftScore = a[4];
const rightScore = b[4];
if (leftScore === rightScore) {
// same score: sort alphabetically
const leftTitle = a[1].toLowerCase();
const rightTitle = b[1].toLowerCase();
if (leftTitle === rightTitle) return 0;
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
}
return leftScore > rightScore ? 1 : -1;
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) => query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter(term => term) // remove remaining empty strings
}
/**
* Search Module
*/
const Search = {
_index: null,
_queued_query: null,
_pulse_status: -1,
htmlToText: (htmlString, anchor) => {
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
for (const removalQuery of [".headerlink", "script", "style"]) {
htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
}
if (anchor) {
const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
if (anchorContent) return anchorContent.textContent;
console.warn(
`Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
);
}
// if anchor not specified or not found, fall back to main content
const docContent = htmlElement.querySelector('[role="main"]');
if (docContent) return docContent.textContent;
console.warn(
"Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
);
return "";
},
init: () => {
const query = new URLSearchParams(window.location.search).get("q");
document
.querySelectorAll('input[name="q"]')
.forEach((el) => (el.value = query));
if (query) Search.performSearch(query);
},
loadIndex: (url) =>
(document.body.appendChild(document.createElement("script")).src = url),
setIndex: (index) => {
Search._index = index;
if (Search._queued_query !== null) {
const query = Search._queued_query;
Search._queued_query = null;
Search.query(query);
}
},
hasIndex: () => Search._index !== null,
deferQuery: (query) => (Search._queued_query = query),
stopPulse: () => (Search._pulse_status = -1),
startPulse: () => {
if (Search._pulse_status >= 0) return;
const pulse = () => {
Search._pulse_status = (Search._pulse_status + 1) % 4;
Search.dots.innerText = ".".repeat(Search._pulse_status);
if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
};
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch: (query) => {
// create the required interface elements
const searchText = document.createElement("h2");
searchText.textContent = _("Searching");
const searchSummary = document.createElement("p");
searchSummary.classList.add("search-summary");
searchSummary.innerText = "";
const searchList = document.createElement("ul");
searchList.setAttribute("role", "list");
searchList.classList.add("search");
const out = document.getElementById("search-results");
Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick!
if (Search.hasIndex()) Search.query(query);
else Search.deferQuery(query);
},
_parseQuery: (query) => {
// stem the search terms and add them to the correct list
const stemmer = new Stemmer();
const searchTerms = new Set();
const excludedTerms = new Set();
const highlightTerms = new Set();
const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
splitQuery(query.trim()).forEach((queryTerm) => {
const queryTermLower = queryTerm.toLowerCase();
// maybe skip this "word"
// stopwords array is from language_data.js
if (
stopwords.indexOf(queryTermLower) !== -1 ||
queryTerm.match(/^\d+$/)
)
return;
// stem the word
let word = stemmer.stemWord(queryTermLower);
// select the correct list
if (word[0] === "-") excludedTerms.add(word.substr(1));
else {
searchTerms.add(word);
highlightTerms.add(queryTermLower);
}
});
if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js
localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" "))
}
// console.debug("SEARCH: searching for:");
// console.info("required: ", [...searchTerms]);
// console.info("excluded: ", [...excludedTerms]);
return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
},
/**
* execute search (requires search index to be loaded)
*/
_performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const allTitles = Search._index.alltitles;
const indexEntries = Search._index.indexentries;
// Collect multiple result groups to be sorted separately and then ordered.
// Each is an array of [docname, title, anchor, descr, score, filename, kind].
const normalResults = [];
const nonMainIndexResults = [];
_removeChildren(document.getElementById("search-progress"));
const queryLower = query.toLowerCase().trim();
for (const [title, foundTitles] of Object.entries(allTitles)) {
if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
for (const [file, id] of foundTitles) {
const score = Math.round(Scorer.title * queryLower.length / title.length);
const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
normalResults.push([
docNames[file],
titles[file] !== title ? `${titles[file]} > ${title}` : title,
id !== null ? "#" + id : "",
null,
score + boost,
filenames[file],
SearchResultKind.title,
]);
}
}
}
// search for explicit entries in index directives
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
for (const [file, id, isMain] of foundEntries) {
const score = Math.round(100 * queryLower.length / entry.length);
const result = [
docNames[file],
titles[file],
id ? "#" + id : "",
null,
score,
filenames[file],
SearchResultKind.index,
];
if (isMain) {
normalResults.push(result);
} else {
nonMainIndexResults.push(result);
}
}
}
}
// lookup as object
objectTerms.forEach((term) =>
normalResults.push(...Search.performObjectSearch(term, objectTerms))
);
// lookup as search terms in fulltext
normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
normalResults.forEach((item) => (item[4] = Scorer.score(item)));
nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
}
// Sort each group of results by score and then alphabetically by name.
normalResults.sort(_orderResultsByScoreThenName);
nonMainIndexResults.sort(_orderResultsByScoreThenName);
// Combine the result groups in (reverse) order.
// Non-main index entries are typically arbitrary cross-references,
// so display them after other results.
let results = [...nonMainIndexResults, ...normalResults];
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
return results.reverse();
},
query: (query) => {
const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
// for debugging
//Search.lastresults = results.slice(); // a copy
// console.info("search results:", Search.lastresults);
// print the results
_displayNextItem(results, results.length, searchTerms, highlightTerms);
},
/**
* search for object names
*/
performObjectSearch: (object, objectTerms) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const objects = Search._index.objects;
const objNames = Search._index.objnames;
const titles = Search._index.titles;
const results = [];
const objectSearchCallback = (prefix, match) => {
const name = match[4]
const fullname = (prefix ? prefix + "." : "") + name;
const fullnameLower = fullname.toLowerCase();
if (fullnameLower.indexOf(object) < 0) return;
let score = 0;
const parts = fullnameLower.split(".");
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullnameLower === object || parts.slice(-1)[0] === object)
score += Scorer.objNameMatch;
else if (parts.slice(-1)[0].indexOf(object) > -1)
score += Scorer.objPartialMatch; // matches in last name
const objName = objNames[match[1]][2];
const title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
const otherTerms = new Set(objectTerms);
otherTerms.delete(object);
if (otherTerms.size > 0) {
const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
if (
[...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
)
return;
}
let anchor = match[3];
if (anchor === "") anchor = fullname;
else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]];
else score += Scorer.objPrioDefault;
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
SearchResultKind.object,
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) =>
objectSearchCallback(prefix, array)
)
);
return results;
},
/**
* search for full-text terms in the index
*/
performTermsSearch: (searchTerms, excludedTerms) => {
// prepare search
const terms = Search._index.terms;
const titleTerms = Search._index.titleterms;
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const titles = Search._index.titles;
const scoreMap = new Map();
const fileMap = new Map();
// perform the search on the required terms
searchTerms.forEach((word) => {
const files = [];
// find documents, if any, containing the query word in their text/title term indices
// use Object.hasOwnProperty to avoid mismatching against prototype properties
const arr = [
{ files: terms.hasOwnProperty(word) ? terms[word] : undefined, score: Scorer.term },
{ files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, score: Scorer.title },
];
// add support for partial matches
if (word.length > 2) {
const escapedWord = _escapeRegExp(word);
if (!terms.hasOwnProperty(word)) {
Object.keys(terms).forEach((term) => {
if (term.match(escapedWord))
arr.push({ files: terms[term], score: Scorer.partialTerm });
});
}
if (!titleTerms.hasOwnProperty(word)) {
Object.keys(titleTerms).forEach((term) => {
if (term.match(escapedWord))
arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
});
}
}
// no match but word was a required one
if (arr.every((record) => record.files === undefined)) return;
// found search word in contents
arr.forEach((record) => {
if (record.files === undefined) return;
let recordFiles = record.files;
if (recordFiles.length === undefined) recordFiles = [recordFiles];
files.push(...recordFiles);
// set score for the word in each file
recordFiles.forEach((file) => {
if (!scoreMap.has(file)) scoreMap.set(file, new Map());
const fileScores = scoreMap.get(file);
fileScores.set(word, record.score);
});
});
// create the mapping
files.forEach((file) => {
if (!fileMap.has(file)) fileMap.set(file, [word]);
else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
});
});
// now check if the files don't contain excluded terms
const results = [];
for (const [file, wordList] of fileMap) {
// check if all requirements are matched
// as search terms with length < 3 are discarded
const filteredTermCount = [...searchTerms].filter(
(term) => term.length > 2
).length;
if (
wordList.length !== searchTerms.size &&
wordList.length !== filteredTermCount
)
continue;
// ensure that none of the excluded terms is in the search result
if (
[...excludedTerms].some(
(term) =>
terms[term] === file ||
titleTerms[term] === file ||
(terms[term] || []).includes(file) ||
(titleTerms[term] || []).includes(file)
)
)
break;
// select one (max) score for the file.
const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w)));
// add result to the result list
results.push([
docNames[file],
titles[file],
"",
null,
score,
filenames[file],
SearchResultKind.text,
]);
}
return results;
},
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words.
*/
makeSearchSummary: (htmlText, keywords, anchor) => {
const text = Search.htmlToText(htmlText, anchor);
if (text === "") return null;
const textLower = text.toLowerCase();
const actualStartPosition = [...keywords]
.map((k) => textLower.indexOf(k.toLowerCase()))
.filter((i) => i > -1)
.slice(-1)[0];
const startWithContext = Math.max(actualStartPosition - 120, 0);
const top = startWithContext === 0 ? "" : "...";
const tail = startWithContext + 240 < text.length ? "..." : "";
let summary = document.createElement("p");
summary.classList.add("context");
summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
return summary;
},
};
_ready(Search.init);

154
_static/sphinx_highlight.js Normal file
View File

@ -0,0 +1,154 @@
/* Highlighting utilities for Sphinx HTML documentation. */
"use strict";
const SPHINX_HIGHLIGHT_ENABLED = true
/**
* highlight a given string on a node by wrapping it in
* span elements with the given class name.
*/
const _highlight = (node, addItems, text, className) => {
if (node.nodeType === Node.TEXT_NODE) {
const val = node.nodeValue;
const parent = node.parentNode;
const pos = val.toLowerCase().indexOf(text);
if (
pos >= 0 &&
!parent.classList.contains(className) &&
!parent.classList.contains("nohighlight")
) {
let span;
const closestNode = parent.closest("body, svg, foreignObject");
const isInSVG = closestNode && closestNode.matches("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
const rest = document.createTextNode(val.substr(pos + text.length));
parent.insertBefore(
span,
parent.insertBefore(
rest,
node.nextSibling
)
);
node.nodeValue = val.substr(0, pos);
/* There may be more occurrences of search term in this node. So call this
* function recursively on the remaining fragment.
*/
_highlight(rest, addItems, text, className);
if (isInSVG) {
const rect = document.createElementNS(
"http://www.w3.org/2000/svg",
"rect"
);
const bbox = parent.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
}
}
} else if (node.matches && !node.matches("button, select, textarea")) {
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
}
};
const _highlightText = (thisNode, text, className) => {
let addItems = [];
_highlight(thisNode, addItems, text, className);
addItems.forEach((obj) =>
obj.parent.insertAdjacentElement("beforebegin", obj.target)
);
};
/**
* Small JavaScript module for the documentation.
*/
const SphinxHighlight = {
/**
* highlight the search words provided in localstorage in the text
*/
highlightSearchWords: () => {
if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight
// get and clear terms from localstorage
const url = new URL(window.location);
const highlight =
localStorage.getItem("sphinx_highlight_terms")
|| url.searchParams.get("highlight")
|| "";
localStorage.removeItem("sphinx_highlight_terms")
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
// get individual terms from highlight string
const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
if (terms.length === 0) return; // nothing to do
// There should never be more than one element matching "div.body"
const divBody = document.querySelectorAll("div.body");
const body = divBody.length ? divBody[0] : document.querySelector("body");
window.setTimeout(() => {
terms.forEach((term) => _highlightText(body, term, "highlighted"));
}, 10);
const searchBox = document.getElementById("searchbox");
if (searchBox === null) return;
searchBox.appendChild(
document
.createRange()
.createContextualFragment(
'<p class="highlight-link">' +
'<a href="javascript:SphinxHighlight.hideSearchWords()">' +
_("Hide Search Matches") +
"</a></p>"
)
);
},
/**
* helper function to hide the search marks again
*/
hideSearchWords: () => {
document
.querySelectorAll("#searchbox .highlight-link")
.forEach((el) => el.remove());
document
.querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
localStorage.removeItem("sphinx_highlight_terms")
},
initEscapeListener: () => {
// only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return;
document.addEventListener("keydown", (event) => {
// bail for input elements
if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return;
// bail with special keys
if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return;
if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) {
SphinxHighlight.hideSearchWords();
event.preventDefault();
}
});
},
};
_ready(() => {
/* Do not call highlightSearchWords() when we are on the search page.
* It will highlight words from the *previous* search query.
*/
if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords();
SphinxHighlight.initEscapeListener();
});

934
chiken_rabbit.html Normal file
View File

@ -0,0 +1,934 @@
<!DOCTYPE html>
<html class="writer-html5" lang="zh" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>鸡兔同笼问题 &mdash; Class Boru 文档</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=9edc463e" />
<link rel="stylesheet" type="text/css" href="_static/plot_directive.css" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=2ccfc426"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<script type="module">import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11.12.1/dist/mermaid.esm.min.mjs";
const initStyles = () => {
const defaultStyle = document.createElement('style');
defaultStyle.textContent = `pre.mermaid {
/* Same as .mermaid-container > pre */
display: block;
width: 100%;
}
pre.mermaid > svg {
/* Same as .mermaid-container > pre > svg */
height: 500px;
width: 100%;
max-width: 100% !important;
}`;
document.head.appendChild(defaultStyle);
const fullscreenStyle = document.createElement('style');
fullscreenStyle.textContent = `.mermaid-container {
display: flex;
flex-direction: row;
width: 100%;
}
.mermaid-container > pre {
display: block;
width: 100%;
}
.mermaid-container > pre > svg {
height: 500px;
width: 100%;
max-width: 100% !important;
}
.mermaid-fullscreen-btn {
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
font-size: 14px;
line-height: 1;
padding: 0;
color: #333;
}
.mermaid-fullscreen-btn:hover {
opacity: 100% !important;
background: rgba(255, 255, 255, 1);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
transform: scale(1.1);
}
.mermaid-fullscreen-btn.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.3);
color: #e0e0e0;
}
.mermaid-fullscreen-btn.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 3px 10px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal {
display: none;
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
padding: 20px;
overflow: auto;
}
.mermaid-fullscreen-modal.dark-theme {
background: rgba(0, 0, 0, 0.98);
}
.mermaid-fullscreen-modal.active {
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
max-width: 95vw;
max-height: 90vh;
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
overflow: auto;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen .mermaid svg {
height: 100% !important;
width: 100% !important;
cursor: grab;
}
.mermaid-fullscreen-close {
position: fixed !important;
top: 20px !important;
right: 20px !important;
width: 40px;
height: 40px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 50%;
cursor: pointer;
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.2s;
font-size: 24px;
line-height: 1;
color: #333;
}
.mermaid-fullscreen-close:hover {
background: white;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
transform: scale(1.1);
}
.mermaid-fullscreen-close.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.2);
color: #e0e0e0;
}
.mermaid-fullscreen-close.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 6px 16px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
}`;
document.head.appendChild(fullscreenStyle);
}
// Detect if page has dark background
const isDarkTheme = () => {
// We use a set of heuristics:
// 1. Check for common dark mode classes or attributes
// 2. Check computed background color brightness
if (document.documentElement.classList.contains('dark') ||
document.documentElement.getAttribute('data-theme') === 'dark' ||
document.body.classList.contains('dark') ||
document.body.getAttribute('data-theme') === 'dark') {
// console.log("Dark theme detected via class/attribute");
return true;
}
if (document.documentElement.classList.contains('light') ||
document.documentElement.getAttribute('data-theme') === 'light' ||
document.body.classList.contains('light') ||
document.body.getAttribute('data-theme') === 'light') {
// console.log("Light theme detected via class/attribute");
return false;
}
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
// console.log("Dark theme detected via prefers-color-scheme");
return true;
}
const bgColor = window.getComputedStyle(document.body).backgroundColor;
const match = bgColor.match(/rgb\((\d+),\s*(\d+),\s*(\d+)/);
if (match) {
const r = parseInt(match[1]);
const g = parseInt(match[2]);
const b = parseInt(match[3]);
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
// console.log("Background color brightness:", brightness);
return brightness < 128;
}
// console.log("No dark or light theme detected, defaulting to light theme");
return false;
};
let darkTheme = isDarkTheme();
let modal = null;
let modalContent = null;
let previousScrollOffset = [window.scrollX, window.scrollY];
const runMermaid = async (rerun) => {
console.log("Running mermaid diagrams, rerun =", rerun);
// clear all existing mermaid charts
let all_mermaids = document.querySelectorAll(".mermaid");
if (rerun) {
all_mermaids.forEach((el) => {
if(!el.hasAttribute("data-original-code")) {
// store original code
// console.log(`Storing original code for first run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
if(el.getAttribute("data-processed") === "true") {
// remove and restore original
el.removeAttribute("data-processed");
// console.log(`Restoring original code for re-run: `, el.getAttribute('data-original-code'));
el.innerHTML = el.getAttribute('data-original-code');
} else {
// store original code
// console.log(`Storing original code for re-run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
});
await mermaid.run();
}
all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
if ("False" === "True") {
const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
if(mermaids_to_add_zoom > 0) {
var svgs = d3.selectAll("");
if(all_mermaids.length !== mermaids_processed.length) {
setTimeout(() => runMermaid(false), 200);
return;
} else if(svgs.size() !== mermaids_to_add_zoom) {
setTimeout(() => runMermaid(false), 200);
return;
} else {
svgs.each(function() {
var svg = d3.select(this);
svg.html("<g class='wrapper'>" + svg.html() + "</g>");
var inner = svg.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svg.call(zoom);
});
}
}
} else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
setTimeout(() => runMermaid(false), 200);
return;
}
// Stop here if not adding fullscreen capability
if ("True" !== "True") return;
if (modal !== null ) {
// Destroy existing modal
modal.remove();
modal = null;
modalContent = null;
}
modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
modal.setAttribute('aria-modal', 'true');
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen"></button>
<div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
document.body.style.overflow = ''
window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
modal.addEventListener('click', (e) => {
if (e.target === modal) closeModal();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modal.classList.contains('active')) {
closeModal();
}
});
document.querySelectorAll('.mermaid').forEach((mermaidDiv) => {
if (mermaidDiv.parentNode.classList.contains('mermaid-container') ||
mermaidDiv.closest('.mermaid-fullscreen-modal')) {
// Already processed, adjust button class if needed
const existingBtn = mermaidDiv.parentNode.querySelector('.mermaid-fullscreen-btn');
if (existingBtn) {
existingBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
}
return;
}
const container = document.createElement('div');
container.className = 'mermaid-container';
mermaidDiv.parentNode.insertBefore(container, mermaidDiv);
container.appendChild(mermaidDiv);
const fullscreenBtn = document.createElement('button');
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
const marginTop = parseFloat(diagramStyle.marginTop) || 0;
const marginRight = parseFloat(diagramStyle.marginRight) || 0;
const paddingTop = parseFloat(diagramStyle.paddingTop) || 0;
const paddingRight = parseFloat(diagramStyle.paddingRight) || 0;
fullscreenBtn.style.top = `${marginTop + paddingTop + 4}px`;
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
const svg = clone.querySelector('svg');
if (svg) {
svg.removeAttribute('width');
svg.removeAttribute('height');
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
svg.style.sdisplay = 'block';
if ("False" === "True") {
setTimeout(() => {
const g = svg.querySelector('g');
if (g) {
var svgD3 = d3.select(svg);
svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
var inner = svgD3.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svgD3.call(zoom);
}
}, 100);
}
}
modal.classList.add('active');
document.body.style.overflow = 'hidden';
});
container.appendChild(fullscreenBtn);
});
};
const load = async () => {
initStyles();
await runMermaid(true);
const reRunIfThemeChanges = async () => {
const newDarkTheme = isDarkTheme();
if (newDarkTheme !== darkTheme) {
darkTheme = newDarkTheme;
console.log("Theme change detected, re-running mermaid with", darkTheme ? "dark" : "default", "theme");
await mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
await runMermaid(true);
}
};
// Update theme classes when theme changes
const themeObserver = new MutationObserver(reRunIfThemeChanges);
themeObserver.observe(document.documentElement, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
themeObserver.observe(document.body, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
};
console.log("Initializing mermaid with", darkTheme ? "dark" : "default", "theme");
mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
window.addEventListener("load", load);</script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
<link rel="next" title="最大公约数与最小公倍数" href="gcd_lcm.html" />
<link rel="prev" title="Class Boru" href="index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Class Boru
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">鸡兔同笼问题</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id2">第一部分:故事引入</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">第二部分:直观观察</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id4">动物特征对比</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id5">已知条件与目标</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id6">第三部分:解法一(假设法,适合低年级)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id7">核心思路</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id8">详细步骤</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id9">第四部分:解法二(代入法,适合中年级)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id10">核心思路</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id11">详细步骤</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id12">第五部分:解法三(方程法,适合高年级)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id13">核心思路</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id14">详细步骤</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id15">第六部分:方法比较</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id16">方法对比</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id17">殊途同归</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id18">第七部分:互动练习</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id19">题 1: 鸡兔同笼问题(变式)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id20">题 2: 桌椅问题</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id21">题 3: 铅笔和钢笔问题</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id22">题 4: 公交车和小汽车问题</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id23">题 5: 鸡兔鸭同笼问题(进阶)</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id24">第八部分:小结</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id25">知识结构</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id26">解题步骤</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id27">要点总结</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id28">思考题</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="gcd_lcm.html">最大公约数与最小公倍数</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Class Boru</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="页面导航">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">鸡兔同笼问题</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/chiken_rabbit.rst.txt" rel="nofollow"> 查看页面源码</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="id1">
<h1>鸡兔同笼问题<a class="headerlink" href="#id1" title="Link to this heading"></a></h1>
<section id="id2">
<h2>第一部分:故事引入<a class="headerlink" href="#id2" title="Link to this heading"></a></h2>
<p>农场里有一个笼子,里面关着鸡和兔。农夫数了数,发现笼子里共有 35 个头, 94 只脚。农夫很困惑:到底有多少只鸡,多少只兔呢?请你来帮忙!</p>
<p><strong>问题场景</strong></p>
<pre class="mermaid">
flowchart LR
A[农夫观察笼子] --&gt; B[数头: 35个]
A --&gt; C[数脚: 94只]
</pre><p><strong>求解目标</strong></p>
<pre class="mermaid">
flowchart LR
D[? 多少只鸡] --&gt; E[需要方法求解]
F[? 多少只兔] --&gt; E
</pre></section>
<section id="id3">
<h2>第二部分:直观观察<a class="headerlink" href="#id3" title="Link to this heading"></a></h2>
<section id="id4">
<h3>动物特征对比<a class="headerlink" href="#id4" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>动物</p></th>
<th class="head"><p>头数</p></th>
<th class="head"><p>脚数</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p></p></td>
<td><p>1</p></td>
<td><p>2</p></td>
</tr>
<tr class="row-odd"><td><p></p></td>
<td><p>1</p></td>
<td><p>4</p></td>
</tr>
</tbody>
</table>
</section>
<section id="id5">
<h3>已知条件与目标<a class="headerlink" href="#id5" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
H[头数=35] --&gt; X[求: 鸡数x]
F[脚数=94] --&gt; Y[求: 兔数y]
</pre><p>关系梳理:</p>
<ul class="simple">
<li><p>鸡有 2 条腿,兔有 4 条腿</p></li>
<li><p>头数总和: 35(每只动物一个头)</p></li>
<li><p>脚数总和: 94</p></li>
<li><p>我们需要找到鸡和兔的数量</p></li>
</ul>
</section>
</section>
<section id="id6">
<h2>第三部分:解法一(假设法,适合低年级)<a class="headerlink" href="#id6" title="Link to this heading"></a></h2>
<section id="id7">
<h3>核心思路<a class="headerlink" href="#id7" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[假设全是鸡] --&gt; B[计算脚数差]
B --&gt; C[求出兔数]
C --&gt; D[求出鸡数]
</pre></section>
<section id="id8">
<h3>详细步骤<a class="headerlink" href="#id8" title="Link to this heading"></a></h3>
<p><strong>步骤1: 假设全是鸡</strong></p>
<pre class="mermaid">
flowchart LR
A[35只全是鸡] --&gt; B[&quot;脚数 = 35*2 = 70&quot;]
</pre><div class="math notranslate nohighlight">
\[35 \times 2 = 70 \quad \text{只脚}\]</div>
<p><strong>步骤2: 发现差距</strong></p>
<pre class="mermaid">
flowchart LR
A[假设: 70只脚] --&gt; C[差额: 24只脚]
B[实际: 94只脚] --&gt; C
</pre><p>实际脚数是 94, 比假设多:</p>
<div class="math notranslate nohighlight">
\[94 - 70 = 24\]</div>
<p><strong>步骤3: 修正假设</strong></p>
<pre class="mermaid">
flowchart LR
A[差额 24 只脚] --&gt; B[每兔多 2 只脚]
B --&gt; C[&quot;兔数 = 24/2 = 12&quot;]
C --&gt; D[&quot;鸡数 = 35-12 = 23&quot;]
</pre><p>每只兔比鸡多 2 条腿,因此兔的数量为:</p>
<div class="math notranslate nohighlight">
\[\frac{24}{2} = 12\]</div>
<p>所以鸡的数量为:</p>
<div class="math notranslate nohighlight">
\[35 - 12 = 23\]</div>
<p><strong>步骤4: 验证结果</strong></p>
<pre class="mermaid">
flowchart LR
A[&quot;鸡: 23*2 = 46脚&quot;] --&gt; C[总计: 94脚]
B[&quot;兔: 12*4 = 48脚&quot;] --&gt; C
</pre><p>验证: 12 * 4 + 23 * 2 = 48 + 46 = 94 (正确)</p>
</section>
</section>
<section id="id9">
<h2>第四部分:解法二(代入法,适合中年级)<a class="headerlink" href="#id9" title="Link to this heading"></a></h2>
<section id="id10">
<h3>核心思路<a class="headerlink" href="#id10" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[设鸡x, 兔y] --&gt; B[由头数得y=35-x]
B --&gt; C[代入脚数方程]
C --&gt; D[求解x, y]
</pre></section>
<section id="id11">
<h3>详细步骤<a class="headerlink" href="#id11" title="Link to this heading"></a></h3>
<p>设鸡为 <span class="math notranslate nohighlight">\(x\)</span>,兔为 <span class="math notranslate nohighlight">\(y\)</span></p>
<p><strong>步骤1: 建立关系</strong></p>
<pre class="mermaid">
flowchart LR
A[&quot;x + y = 35&quot;] --&gt; B[&quot;y = 35 - x&quot;]
B --&gt; C[代入方程2]
</pre><p>由头数方程:</p>
<div class="math notranslate nohighlight">
\[y = 35 - x\]</div>
<p><strong>步骤2: 代入求解</strong></p>
<pre class="mermaid">
flowchart TD
A[&quot;2x + 4(35-x) = 94&quot;]
B[&quot;-2x = -46&quot;]
C[&quot;x = 23, y = 12&quot;]
A --&gt; B --&gt; C
</pre><p>代入脚数方程:</p>
<div class="math notranslate nohighlight">
\[2x + 4(35 - x) = 94\]</div>
<p>化简:</p>
<div class="math notranslate nohighlight">
\[\begin{split}-2x + 140 = 94 \\
-2x = -46 \\
x = 23\end{split}\]</div>
<p>所以 <span class="math notranslate nohighlight">\(y = 35 - 23 = 12\)</span></p>
</section>
</section>
<section id="id12">
<h2>第五部分:解法三(方程法,适合高年级)<a class="headerlink" href="#id12" title="Link to this heading"></a></h2>
<section id="id13">
<h3>核心思路<a class="headerlink" href="#id13" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[建立方程组] --&gt; B[选择解法]
B --&gt; C[代入法/消元法]
C --&gt; D[求解答案]
</pre></section>
<section id="id14">
<h3>详细步骤<a class="headerlink" href="#id14" title="Link to this heading"></a></h3>
<p>建立方程组:</p>
<div class="math notranslate nohighlight">
\[\begin{split}\begin{cases}
x + y = 35 \\
2x + 4y = 94
\end{cases}\end{split}\]</div>
<p><strong>方法一:代入法</strong></p>
<pre class="mermaid">
flowchart LR
A[&quot;x = 35-y&quot;] --&gt; B[&quot;代入第二式&quot;]
B --&gt; C[&quot;y = 12, x = 23&quot;]
</pre><p><strong>方法二:消元法</strong></p>
<pre class="mermaid">
flowchart LR
A[&quot;方程1 x2&quot;] --&gt; B[&quot;相减消元&quot;]
B --&gt; C[&quot;y = 12&quot;]
C --&gt; D[&quot;x = 23&quot;]
</pre><p>答案:鸡 23 只,兔 12 只</p>
</section>
</section>
<section id="id15">
<h2>第六部分:方法比较<a class="headerlink" href="#id15" title="Link to this heading"></a></h2>
<section id="id16">
<h3>方法对比<a class="headerlink" href="#id16" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>方法</p></th>
<th class="head"><p>特点</p></th>
<th class="head"><p>适合年级</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>假设法</p></td>
<td><p>直观易懂</p></td>
<td><p>低年级</p></td>
</tr>
<tr class="row-odd"><td><p>代入法</p></td>
<td><p>步骤清晰</p></td>
<td><p>中年级</p></td>
</tr>
<tr class="row-even"><td><p>方程法</p></td>
<td><p>系统严谨</p></td>
<td><p>高年级</p></td>
</tr>
</tbody>
</table>
</section>
<section id="id17">
<h3>殊途同归<a class="headerlink" href="#id17" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[假设法] --&gt; D[答案: 鸡23, 兔12]
B[代入法] --&gt; D
C[方程法] --&gt; D
</pre></section>
</section>
<section id="id18">
<h2>第七部分:互动练习<a class="headerlink" href="#id18" title="Link to this heading"></a></h2>
<section id="id19">
<h3>题 1: 鸡兔同笼问题(变式)<a class="headerlink" href="#id19" title="Link to this heading"></a></h3>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[头数: 40] --&gt; C[求: 鸡? 兔?]
B[脚数: 100] --&gt; C
</pre><div class="math notranslate nohighlight">
\[\begin{split}\begin{cases}
x + y = 40 \\
2x + 4y = 100
\end{cases}\end{split}\]</div>
<p>(<a class="reference download internal" download="" href="_downloads/a94fafa94be25f1c8ec401e82227576b/chiken_rabbit-1.py"><code class="xref download docutils literal notranslate"><span class="pre">Source</span> <span class="pre">code</span></code></a>, <a class="reference download internal" download="" href="_downloads/37e6167328373e075b38d8102904a139/chiken_rabbit-1.png"><code class="xref download docutils literal notranslate"><span class="pre">png</span></code></a>, <a class="reference download internal" download="" href="_downloads/8c1c80f4d2d6f1cb60246473334080dc/chiken_rabbit-1.hires.png"><code class="xref download docutils literal notranslate"><span class="pre">hires.png</span></code></a>, <a class="reference download internal" download="" href="_downloads/8ba83051d91e7c4f5f8d5c43aba70b01/chiken_rabbit-1.pdf"><code class="xref download docutils literal notranslate"><span class="pre">pdf</span></code></a>)</p>
<figure class="align-default">
<img alt="_images/chiken_rabbit-1.png" class="plot-directive" src="_images/chiken_rabbit-1.png" />
</figure>
<p>答案:鸡 30 只,兔 10 只</p>
</section>
<section id="id20">
<h3>题 2: 桌椅问题<a class="headerlink" href="#id20" title="Link to this heading"></a></h3>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[桌子: 4腿] --&gt; C[求: 桌子?]
B[椅子: 3腿] --&gt; D[求: 椅子?]
E[总数: 30件] --&gt; C
F[总腿: 100] --&gt; D
</pre><div class="math notranslate nohighlight">
\[\begin{split}\begin{cases}
x + y = 30 \\
4x + 3y = 100
\end{cases}\end{split}\]</div>
<p>(<a class="reference download internal" download="" href="_downloads/87b6e1ed6106856d9e3ee2a5004dab8c/chiken_rabbit-2.py"><code class="xref download docutils literal notranslate"><span class="pre">Source</span> <span class="pre">code</span></code></a>, <a class="reference download internal" download="" href="_downloads/bc0bc70f099c24cb44b0bea1b022ac9a/chiken_rabbit-2.png"><code class="xref download docutils literal notranslate"><span class="pre">png</span></code></a>, <a class="reference download internal" download="" href="_downloads/518ebceaa568ca795b89b2e12e4fd3d7/chiken_rabbit-2.hires.png"><code class="xref download docutils literal notranslate"><span class="pre">hires.png</span></code></a>, <a class="reference download internal" download="" href="_downloads/a0a9b695733384151521688296d34892/chiken_rabbit-2.pdf"><code class="xref download docutils literal notranslate"><span class="pre">pdf</span></code></a>)</p>
<figure class="align-default">
<img alt="_images/chiken_rabbit-2.png" class="plot-directive" src="_images/chiken_rabbit-2.png" />
</figure>
<p>答案:桌子 10 张,椅子 20 把</p>
</section>
<section id="id21">
<h3>题 3: 铅笔和钢笔问题<a class="headerlink" href="#id21" title="Link to this heading"></a></h3>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[铅笔: 1元/支] --&gt; C[求: 铅笔?]
B[钢笔: 3元/支] --&gt; D[求: 钢笔?]
E[总数: 40支] --&gt; C
F[总价: 80元] --&gt; D
</pre><div class="math notranslate nohighlight">
\[\begin{split}\begin{cases}
x + y = 40 \\
x + 3y = 80
\end{cases}\end{split}\]</div>
<p>答案:铅笔 20 支,钢笔 20 支</p>
</section>
<section id="id22">
<h3>题 4: 公交车和小汽车问题<a class="headerlink" href="#id22" title="Link to this heading"></a></h3>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[公交: 40轮] --&gt; C[求: 公交?]
B[汽车: 4轮] --&gt; D[求: 汽车?]
E[总数: 20辆] --&gt; C
F[总轮: 296] --&gt; D
</pre><div class="math notranslate nohighlight">
\[\begin{split}\begin{cases}
x + y = 20 \\
40x + 4y = 296
\end{cases}\end{split}\]</div>
<p>答案:公交车 6 辆,小汽车 14 辆</p>
</section>
<section id="id23">
<h3>题 5: 鸡兔鸭同笼问题(进阶)<a class="headerlink" href="#id23" title="Link to this heading"></a></h3>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[鸡: 2腿] --&gt; D[求: 鸡?]
B[兔: 4腿] --&gt; E[求: 兔?]
C[鸭: 2腿] --&gt; F[求: 鸭?]
G[总数: 60只] --&gt; D
H[总腿: 160] --&gt; E
I[鸡比鸭多10只] --&gt; F
</pre><div class="math notranslate nohighlight">
\[\begin{split}\begin{cases}
x + y + z = 60 \\
2x + 4y + 2z = 160 \\
x - z = 10
\end{cases\end{split}\]</div>
<p>答案:鸡 25 只,兔 20 只,鸭 15 只</p>
</section>
</section>
<section id="id24">
<h2>第八部分:小结<a class="headerlink" href="#id24" title="Link to this heading"></a></h2>
<section id="id25">
<h3>知识结构<a class="headerlink" href="#id25" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart TB
A[鸡兔同笼问题] --&gt; B[假设法]
A --&gt; C[代入法]
A --&gt; D[方程法]
</pre></section>
<section id="id26">
<h3>解题步骤<a class="headerlink" href="#id26" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[分析问题] --&gt; B[选择方法]
B --&gt; C[求解]
C --&gt; D[验证答案]
</pre></section>
<section id="id27">
<h3>要点总结<a class="headerlink" href="#id27" title="Link to this heading"></a></h3>
<ol class="arabic simple">
<li><p>鸡兔同笼问题是典型的应用题,核心是找到头数和腿数的关系</p></li>
<li><p>三种解法各有优劣</p></li>
<li><p>数学的魅力在于不同路径可以通向同一个答案</p></li>
<li><p>解题后要验证结果</p></li>
</ol>
</section>
</section>
<section id="id28">
<h2>思考题<a class="headerlink" href="#id28" title="Link to this heading"></a></h2>
<p>如果笼子里有若干只蜘蛛8条腿、蜻蜓6条腿和蝉6条腿共 20 只,总共 130 条腿。已知蜘蛛比蝉多 1 只。问每种昆虫各有多少只?</p>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[蜘蛛: 8腿] --&gt; D[求: 蜘蛛?]
B[蜻蜓: 6腿] --&gt; E[求: 蜻蜓?]
C[蝉: 6腿] --&gt; F[求: 蝉?]
G[总数: 20只] --&gt; D
H[总腿: 130] --&gt; E
I[蜘蛛=蝉+1] --&gt; F
</pre><p><strong>解题提示</strong></p>
<pre class="mermaid">
flowchart LR
A[设蝉为z只] --&gt; B[蜘蛛=z+1只]
B --&gt; C[蜻蜓=19-2z只]
C --&gt; D[列腿数方程求解]
</pre></section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="页脚">
<a href="index.html" class="btn btn-neutral float-left" title="Class Boru" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> 上一页</a>
<a href="gcd_lcm.html" class="btn btn-neutral float-right" title="最大公约数与最小公倍数" accesskey="n" rel="next">下一页 <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; 版权所有 2026, Milse Sui。</p>
</div>
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
<a href="https://readthedocs.org">Read the Docs</a> 开发.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

939
gcd_lcm.html Normal file
View File

@ -0,0 +1,939 @@
<!DOCTYPE html>
<html class="writer-html5" lang="zh" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>最大公约数与最小公倍数 &mdash; Class Boru 文档</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=9edc463e" />
<link rel="stylesheet" type="text/css" href="_static/plot_directive.css" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=2ccfc426"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<script type="module">import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11.12.1/dist/mermaid.esm.min.mjs";
const initStyles = () => {
const defaultStyle = document.createElement('style');
defaultStyle.textContent = `pre.mermaid {
/* Same as .mermaid-container > pre */
display: block;
width: 100%;
}
pre.mermaid > svg {
/* Same as .mermaid-container > pre > svg */
height: 500px;
width: 100%;
max-width: 100% !important;
}`;
document.head.appendChild(defaultStyle);
const fullscreenStyle = document.createElement('style');
fullscreenStyle.textContent = `.mermaid-container {
display: flex;
flex-direction: row;
width: 100%;
}
.mermaid-container > pre {
display: block;
width: 100%;
}
.mermaid-container > pre > svg {
height: 500px;
width: 100%;
max-width: 100% !important;
}
.mermaid-fullscreen-btn {
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
font-size: 14px;
line-height: 1;
padding: 0;
color: #333;
}
.mermaid-fullscreen-btn:hover {
opacity: 100% !important;
background: rgba(255, 255, 255, 1);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
transform: scale(1.1);
}
.mermaid-fullscreen-btn.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.3);
color: #e0e0e0;
}
.mermaid-fullscreen-btn.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 3px 10px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal {
display: none;
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
padding: 20px;
overflow: auto;
}
.mermaid-fullscreen-modal.dark-theme {
background: rgba(0, 0, 0, 0.98);
}
.mermaid-fullscreen-modal.active {
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
max-width: 95vw;
max-height: 90vh;
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
overflow: auto;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen .mermaid svg {
height: 100% !important;
width: 100% !important;
cursor: grab;
}
.mermaid-fullscreen-close {
position: fixed !important;
top: 20px !important;
right: 20px !important;
width: 40px;
height: 40px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 50%;
cursor: pointer;
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.2s;
font-size: 24px;
line-height: 1;
color: #333;
}
.mermaid-fullscreen-close:hover {
background: white;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
transform: scale(1.1);
}
.mermaid-fullscreen-close.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.2);
color: #e0e0e0;
}
.mermaid-fullscreen-close.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 6px 16px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
}`;
document.head.appendChild(fullscreenStyle);
}
// Detect if page has dark background
const isDarkTheme = () => {
// We use a set of heuristics:
// 1. Check for common dark mode classes or attributes
// 2. Check computed background color brightness
if (document.documentElement.classList.contains('dark') ||
document.documentElement.getAttribute('data-theme') === 'dark' ||
document.body.classList.contains('dark') ||
document.body.getAttribute('data-theme') === 'dark') {
// console.log("Dark theme detected via class/attribute");
return true;
}
if (document.documentElement.classList.contains('light') ||
document.documentElement.getAttribute('data-theme') === 'light' ||
document.body.classList.contains('light') ||
document.body.getAttribute('data-theme') === 'light') {
// console.log("Light theme detected via class/attribute");
return false;
}
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
// console.log("Dark theme detected via prefers-color-scheme");
return true;
}
const bgColor = window.getComputedStyle(document.body).backgroundColor;
const match = bgColor.match(/rgb\((\d+),\s*(\d+),\s*(\d+)/);
if (match) {
const r = parseInt(match[1]);
const g = parseInt(match[2]);
const b = parseInt(match[3]);
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
// console.log("Background color brightness:", brightness);
return brightness < 128;
}
// console.log("No dark or light theme detected, defaulting to light theme");
return false;
};
let darkTheme = isDarkTheme();
let modal = null;
let modalContent = null;
let previousScrollOffset = [window.scrollX, window.scrollY];
const runMermaid = async (rerun) => {
console.log("Running mermaid diagrams, rerun =", rerun);
// clear all existing mermaid charts
let all_mermaids = document.querySelectorAll(".mermaid");
if (rerun) {
all_mermaids.forEach((el) => {
if(!el.hasAttribute("data-original-code")) {
// store original code
// console.log(`Storing original code for first run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
if(el.getAttribute("data-processed") === "true") {
// remove and restore original
el.removeAttribute("data-processed");
// console.log(`Restoring original code for re-run: `, el.getAttribute('data-original-code'));
el.innerHTML = el.getAttribute('data-original-code');
} else {
// store original code
// console.log(`Storing original code for re-run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
});
await mermaid.run();
}
all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
if ("False" === "True") {
const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
if(mermaids_to_add_zoom > 0) {
var svgs = d3.selectAll("");
if(all_mermaids.length !== mermaids_processed.length) {
setTimeout(() => runMermaid(false), 200);
return;
} else if(svgs.size() !== mermaids_to_add_zoom) {
setTimeout(() => runMermaid(false), 200);
return;
} else {
svgs.each(function() {
var svg = d3.select(this);
svg.html("<g class='wrapper'>" + svg.html() + "</g>");
var inner = svg.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svg.call(zoom);
});
}
}
} else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
setTimeout(() => runMermaid(false), 200);
return;
}
// Stop here if not adding fullscreen capability
if ("True" !== "True") return;
if (modal !== null ) {
// Destroy existing modal
modal.remove();
modal = null;
modalContent = null;
}
modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
modal.setAttribute('aria-modal', 'true');
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen"></button>
<div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
document.body.style.overflow = ''
window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
modal.addEventListener('click', (e) => {
if (e.target === modal) closeModal();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modal.classList.contains('active')) {
closeModal();
}
});
document.querySelectorAll('.mermaid').forEach((mermaidDiv) => {
if (mermaidDiv.parentNode.classList.contains('mermaid-container') ||
mermaidDiv.closest('.mermaid-fullscreen-modal')) {
// Already processed, adjust button class if needed
const existingBtn = mermaidDiv.parentNode.querySelector('.mermaid-fullscreen-btn');
if (existingBtn) {
existingBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
}
return;
}
const container = document.createElement('div');
container.className = 'mermaid-container';
mermaidDiv.parentNode.insertBefore(container, mermaidDiv);
container.appendChild(mermaidDiv);
const fullscreenBtn = document.createElement('button');
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
const marginTop = parseFloat(diagramStyle.marginTop) || 0;
const marginRight = parseFloat(diagramStyle.marginRight) || 0;
const paddingTop = parseFloat(diagramStyle.paddingTop) || 0;
const paddingRight = parseFloat(diagramStyle.paddingRight) || 0;
fullscreenBtn.style.top = `${marginTop + paddingTop + 4}px`;
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
const svg = clone.querySelector('svg');
if (svg) {
svg.removeAttribute('width');
svg.removeAttribute('height');
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
svg.style.sdisplay = 'block';
if ("False" === "True") {
setTimeout(() => {
const g = svg.querySelector('g');
if (g) {
var svgD3 = d3.select(svg);
svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
var inner = svgD3.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svgD3.call(zoom);
}
}, 100);
}
}
modal.classList.add('active');
document.body.style.overflow = 'hidden';
});
container.appendChild(fullscreenBtn);
});
};
const load = async () => {
initStyles();
await runMermaid(true);
const reRunIfThemeChanges = async () => {
const newDarkTheme = isDarkTheme();
if (newDarkTheme !== darkTheme) {
darkTheme = newDarkTheme;
console.log("Theme change detected, re-running mermaid with", darkTheme ? "dark" : "default", "theme");
await mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
await runMermaid(true);
}
};
// Update theme classes when theme changes
const themeObserver = new MutationObserver(reRunIfThemeChanges);
themeObserver.observe(document.documentElement, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
themeObserver.observe(document.body, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
};
console.log("Initializing mermaid with", darkTheme ? "dark" : "default", "theme");
mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
window.addEventListener("load", load);</script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
<link rel="prev" title="鸡兔同笼问题" href="chiken_rabbit.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Class Boru
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="chiken_rabbit.html">鸡兔同笼问题</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">最大公约数与最小公倍数</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#id2">第一部分:故事引入</a></li>
<li class="toctree-l2"><a class="reference internal" href="#id3">第二部分:直观观察</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id4">基本概念</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id5">约数与倍数关系</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id6">第三部分:解法一(列举法,适合低年级)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id7">核心思路</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id8">求最大公约数步骤</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id9">求最小公倍数步骤</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id10">第四部分:解法二(短除法,适合中年级)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id11">核心思路</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id12">求最大公约数</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id13">求最小公倍数</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id14">第五部分:解法三(质因数分解法,适合高年级)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id15">核心思路</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id16">分解质因数</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id17">重要关系</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id18">第六部分:方法比较</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id19">方法对比</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id20">方法选择</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id21">第七部分:互动练习</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id22">题 1: 基础题</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id23">题 2: 应用题(分糖果)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id24">题 3: 应用题(发车问题)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id25">题 4: 进阶题</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id26">题 5: 综合应用题</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id27">第八部分:小结</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id28">知识结构</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id29">重要公式</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id30">解题步骤</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id31">要点总结</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#id32">思考题</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Class Boru</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="页面导航">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">最大公约数与最小公倍数</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/gcd_lcm.rst.txt" rel="nofollow"> 查看页面源码</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="id1">
<h1>最大公约数与最小公倍数<a class="headerlink" href="#id1" title="Link to this heading"></a></h1>
<section id="id2">
<h2>第一部分:故事引入<a class="headerlink" href="#id2" title="Link to this heading"></a></h2>
<p>小明要给班级的图书角买书。他发现如果每6本一包正好包完如果每8本一包也正好包完。小明至少买了多少本书</p>
<p><strong>问题场景</strong></p>
<pre class="mermaid">
flowchart LR
A[买书问题] --&gt; B[6本一包: 正好包完]
A --&gt; C[8本一包: 正好包完]
</pre><p><strong>求解目标</strong></p>
<pre class="mermaid">
flowchart LR
D[求: 至少买多少本?] --&gt; E[需要方法求解]
</pre></section>
<section id="id3">
<h2>第二部分:直观观察<a class="headerlink" href="#id3" title="Link to this heading"></a></h2>
<section id="id4">
<h3>基本概念<a class="headerlink" href="#id4" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>概念</p></th>
<th class="head"><p>定义</p></th>
<th class="head"><p>符号</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>最大公约数</p></td>
<td><p>两个数公有的约数中最大的一个</p></td>
<td><p>GCD</p></td>
</tr>
<tr class="row-odd"><td><p>最小公倍数</p></td>
<td><p>两个数公有的倍数中最小的一个</p></td>
<td><p>LCM</p></td>
</tr>
</tbody>
</table>
</section>
<section id="id5">
<h3>约数与倍数关系<a class="headerlink" href="#id5" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[数a] --&gt; B[约数: 能整除a的数]
A --&gt; C[倍数: a的整数倍]
</pre><p>以6和8为例</p>
<ul class="simple">
<li><p>6的约数1, 2, 3, 6</p></li>
<li><p>8的约数1, 2, 4, 8</p></li>
<li><p>6和8的公约数1, 2</p></li>
<li><p>6和8的最大公约数2</p></li>
<li><p>6的倍数6, 12, 18, 24, 30, ...</p></li>
<li><p>8的倍数8, 16, 24, 32, ...</p></li>
<li><p>6和8的公倍数24, 48, 72, ...</p></li>
<li><p>6和8的最小公倍数24</p></li>
</ul>
</section>
</section>
<section id="id6">
<h2>第三部分:解法一(列举法,适合低年级)<a class="headerlink" href="#id6" title="Link to this heading"></a></h2>
<section id="id7">
<h3>核心思路<a class="headerlink" href="#id7" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[列举约数/倍数] --&gt; B[找公共的]
B --&gt; C[选最大/最小]
</pre></section>
<section id="id8">
<h3>求最大公约数步骤<a class="headerlink" href="#id8" title="Link to this heading"></a></h3>
<p><strong>求18和24的最大公约数</strong></p>
<p><strong>步骤1: 列举约数</strong></p>
<pre class="mermaid">
flowchart LR
A[18的约数] --&gt; B[1, 2, 3, 6, 9, 18]
C[24的约数] --&gt; D[1, 2, 3, 4, 6, 8, 12, 24]
</pre><p><strong>步骤2: 找公约数</strong></p>
<pre class="mermaid">
flowchart LR
A[公约数] --&gt; B[1, 2, 3, 6]
</pre><p><strong>步骤3: 选最大的</strong></p>
<pre class="mermaid">
flowchart LR
A[最大公约数] --&gt; B[GCD = 6]
</pre></section>
<section id="id9">
<h3>求最小公倍数步骤<a class="headerlink" href="#id9" title="Link to this heading"></a></h3>
<p><strong>求18和24的最小公倍数</strong></p>
<p><strong>步骤1: 列举倍数</strong></p>
<pre class="mermaid">
flowchart LR
A[18的倍数] --&gt; B[18, 36, 54, 72, 90, ...]
C[24的倍数] --&gt; D[24, 48, 72, 96, ...]
</pre><p><strong>步骤2: 找公倍数</strong></p>
<pre class="mermaid">
flowchart LR
A[公倍数] --&gt; B[72, 144, ...]
</pre><p><strong>步骤3: 选最小的</strong></p>
<pre class="mermaid">
flowchart LR
A[最小公倍数] --&gt; B[LCM = 72]
</pre></section>
</section>
<section id="id10">
<h2>第四部分:解法二(短除法,适合中年级)<a class="headerlink" href="#id10" title="Link to this heading"></a></h2>
<section id="id11">
<h3>核心思路<a class="headerlink" href="#id11" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[用公因数连续除] --&gt; B[直到互质为止]
B --&gt; C[计算结果]
</pre></section>
<section id="id12">
<h3>求最大公约数<a class="headerlink" href="#id12" title="Link to this heading"></a></h3>
<p><strong>求18和24的最大公约数</strong></p>
<pre class="mermaid">
flowchart TD
A[&quot;2 | 18 24&quot;]
B[&quot;3 | 9 12&quot;]
C[&quot; | 3 4&quot;]
A --&gt; B --&gt; C
</pre><p>计算过程:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">2</span> <span class="o">|</span> <span class="mi">18</span> <span class="mi">24</span>
<span class="o">---------</span>
<span class="mi">3</span> <span class="o">|</span> <span class="mi">9</span> <span class="mi">12</span>
<span class="o">---------</span>
<span class="mi">3</span> <span class="mi">4</span>
</pre></div>
</div>
<p>最大公约数 = 2 × 3 = 6</p>
</section>
<section id="id13">
<h3>求最小公倍数<a class="headerlink" href="#id13" title="Link to this heading"></a></h3>
<p><strong>求18和24的最小公倍数</strong></p>
<p>使用相同的短除过程:</p>
<p>最小公倍数 = 2 × 3 × 3 × 4 = 72</p>
<pre class="mermaid">
flowchart LR
A[&quot;GCD = 所有除数的积&quot;] --&gt; B[&quot;GCD = 2*3 = 6&quot;]
C[&quot;LCM = 所有数的积&quot;] --&gt; D[&quot;LCM = 2*3*3*4 = 72&quot;]
</pre></section>
</section>
<section id="id14">
<h2>第五部分:解法三(质因数分解法,适合高年级)<a class="headerlink" href="#id14" title="Link to this heading"></a></h2>
<section id="id15">
<h3>核心思路<a class="headerlink" href="#id15" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[分解质因数] --&gt; B[提取公共部分]
B --&gt; C[计算结果]
</pre></section>
<section id="id16">
<h3>分解质因数<a class="headerlink" href="#id16" title="Link to this heading"></a></h3>
<p><strong>求18和24的GCD和LCM</strong></p>
<p><strong>步骤1: 分解质因数</strong></p>
<pre class="mermaid">
flowchart LR
A[&quot;18 = 2 * 3 * 3&quot;]
B[&quot;24 = 2 * 2 * 2 * 3&quot;]
</pre><p><strong>步骤2: 求GCD</strong></p>
<pre class="mermaid">
flowchart LR
A[取公共质因数的最低次幂] --&gt; B[&quot;GCD = 2^1 * 3^1 = 6&quot;]
</pre><p><strong>步骤3: 求LCM</strong></p>
<pre class="mermaid">
flowchart LR
A[取所有质因数的最高次幂] --&gt; B[&quot;LCM = 2^3 * 3^2 = 72&quot;]
</pre></section>
<section id="id17">
<h3>重要关系<a class="headerlink" href="#id17" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart TD
A[&quot;GCD(a,b) * LCM(a,b) = a * b&quot;]
style A fill:#e8f5e9
</pre><p>验证GCD(18,24) × LCM(18,24) = 6 × 72 = 432 = 18 × 24 ✓</p>
</section>
</section>
<section id="id18">
<h2>第六部分:方法比较<a class="headerlink" href="#id18" title="Link to this heading"></a></h2>
<section id="id19">
<h3>方法对比<a class="headerlink" href="#id19" title="Link to this heading"></a></h3>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>方法</p></th>
<th class="head"><p>特点</p></th>
<th class="head"><p>适合年级</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>列举法</p></td>
<td><p>直观易懂,适合小数</p></td>
<td><p>低年级</p></td>
</tr>
<tr class="row-odd"><td><p>短除法</p></td>
<td><p>计算简便,常用方法</p></td>
<td><p>中年级</p></td>
</tr>
<tr class="row-even"><td><p>质因数分解</p></td>
<td><p>理论清晰,适合大数</p></td>
<td><p>高年级</p></td>
</tr>
</tbody>
</table>
</section>
<section id="id20">
<h3>方法选择<a class="headerlink" href="#id20" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart TD
A[求GCD/LCM] --&gt; B{数字大小}
B --&gt;|小| C[列举法]
B --&gt;|中| D[短除法]
B --&gt;|大| E[质因数分解]
</pre></section>
</section>
<section id="id21">
<h2>第七部分:互动练习<a class="headerlink" href="#id21" title="Link to this heading"></a></h2>
<section id="id22">
<h3>题 1: 基础题<a class="headerlink" href="#id22" title="Link to this heading"></a></h3>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[求12和18] --&gt; B[GCD = ?]
A --&gt; C[LCM = ?]
</pre><p><strong>解答过程</strong></p>
<pre class="mermaid">
flowchart LR
A[&quot;12 = 2*2*3&quot;] --&gt; C[&quot;GCD = 2*3 = 6&quot;]
B[&quot;18 = 2*3*3&quot;] --&gt; D[&quot;LCM = 2*2*3*3 = 36&quot;]
</pre><p>答案GCD(12,18) = 6LCM(12,18) = 36</p>
</section>
<section id="id23">
<h3>题 2: 应用题(分糖果)<a class="headerlink" href="#id23" title="Link to this heading"></a></h3>
<p><strong>题目</strong></p>
<p>小明有12颗糖果小红有18颗糖果。要把它们分别装进袋子里每袋数量相同且最多每袋装几颗</p>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[小明: 12颗] --&gt; C[求: 每袋最多?]
B[小红: 18颗] --&gt; C
</pre><p><strong>分析</strong></p>
<pre class="mermaid">
flowchart LR
A[每袋数量相同] --&gt; C[求GCD]
B[每袋最多] --&gt; C
C --&gt; D[&quot;GCD(12,18) = 6&quot;]
</pre><p>答案每袋最多装6颗</p>
</section>
<section id="id24">
<h3>题 3: 应用题(发车问题)<a class="headerlink" href="#id24" title="Link to this heading"></a></h3>
<p><strong>题目</strong></p>
<p>公交A线每12分钟发一班车公交B线每18分钟发一班车。两车同时发车后至少多少分钟再次同时发车</p>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[A线: 12分钟] --&gt; C[求: 至少多久?]
B[B线: 18分钟] --&gt; C
</pre><p><strong>分析</strong></p>
<pre class="mermaid">
flowchart LR
A[再次同时发车] --&gt; C[求LCM]
B[至少] --&gt; C
C --&gt; D[&quot;LCM(12,18) = 36&quot;]
</pre><p>答案至少36分钟后再次同时发车</p>
</section>
<section id="id25">
<h3>题 4: 进阶题<a class="headerlink" href="#id25" title="Link to this heading"></a></h3>
<p><strong>题目</strong></p>
<p>求三个数12、18、24的最大公约数和最小公倍数。</p>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[12, 18, 24] --&gt; B[GCD = ?]
A --&gt; C[LCM = ?]
</pre><p><strong>解答过程</strong></p>
<pre class="mermaid">
flowchart LR
A[&quot;12 = 2*2*3&quot;] --&gt; D[&quot;GCD = 2*3 = 6&quot;]
B[&quot;18 = 2*3*3&quot;] --&gt; E[&quot;LCM = 2*2*2*3*3 = 72&quot;]
C[&quot;24 = 2*2*2*3&quot;]
</pre><p>答案GCD(12,18,24) = 6LCM(12,18,24) = 72</p>
</section>
<section id="id26">
<h3>题 5: 综合应用题<a class="headerlink" href="#id26" title="Link to this heading"></a></h3>
<p><strong>题目</strong></p>
<p>一个长方形操场长72米宽48米。要在四周插彩旗要求四角都插且相邻两面彩旗之间的距离相等。最少需要插多少面彩旗</p>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[长: 72米] --&gt; C[求: 最少几面?]
B[宽: 48米] --&gt; C
</pre><p><strong>分析</strong></p>
<pre class="mermaid">
flowchart LR
A[距离相等] --&gt; C[求GCD]
B[最少] --&gt; C
C --&gt; D[&quot;GCD(72,48) = 24&quot;]
D --&gt; E[&quot;周长/间隔 = (72+48)*2/24 = 10&quot;]
</pre><p>答案最少需要插10面彩旗</p>
</section>
</section>
<section id="id27">
<h2>第八部分:小结<a class="headerlink" href="#id27" title="Link to this heading"></a></h2>
<section id="id28">
<h3>知识结构<a class="headerlink" href="#id28" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart TB
A[GCD与LCM] --&gt; B[列举法]
A --&gt; C[短除法]
A --&gt; D[质因数分解]
</pre></section>
<section id="id29">
<h3>重要公式<a class="headerlink" href="#id29" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart TD
A[&quot;GCD(a,b) * LCM(a,b) = a * b&quot;]
style A fill:#fff3e0
</pre></section>
<section id="id30">
<h3>解题步骤<a class="headerlink" href="#id30" title="Link to this heading"></a></h3>
<pre class="mermaid">
flowchart LR
A[分析问题] --&gt; B[判断求GCD还是LCM]
B --&gt; C[选择方法]
C --&gt; D[计算验证]
</pre></section>
<section id="id31">
<h3>要点总结<a class="headerlink" href="#id31" title="Link to this heading"></a></h3>
<ol class="arabic simple">
<li><p>最大公约数用于&quot;最多&quot;&quot;最长&quot;等问题</p></li>
<li><p>最小公倍数用于&quot;至少&quot;&quot;最少&quot;等问题</p></li>
<li><p>短除法是最常用的方法</p></li>
<li><p>记住重要关系GCD × LCM = 两数之积</p></li>
</ol>
</section>
</section>
<section id="id32">
<h2>思考题<a class="headerlink" href="#id32" title="Link to this heading"></a></h2>
<p>一个房间长240厘米宽180厘米。要用正方形地砖铺地要求地砖尽可能大且正好铺满。需要多少块地砖每块地砖的面积是多少</p>
<p><strong>已知条件</strong></p>
<pre class="mermaid">
flowchart LR
A[长: 240厘米] --&gt; C[求: 地砖数量?]
B[宽: 180厘米] --&gt; D[求: 每块面积?]
</pre><p><strong>解题提示</strong></p>
<pre class="mermaid">
flowchart LR
A[正方形地砖] --&gt; C[边长 = GCD]
B[尽可能大] --&gt; C
C --&gt; D[&quot;GCD(240,180) = 60&quot;]
D --&gt; E[&quot;数量 = 240*180/(60*60) = 12&quot;]
</pre></section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="页脚">
<a href="chiken_rabbit.html" class="btn btn-neutral float-left" title="鸡兔同笼问题" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> 上一页</a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; 版权所有 2026, Milse Sui。</p>
</div>
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
<a href="https://readthedocs.org">Read the Docs</a> 开发.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

542
genindex.html Normal file
View File

@ -0,0 +1,542 @@
<!DOCTYPE html>
<html class="writer-html5" lang="zh" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>索引 &mdash; Class Boru 文档</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=9edc463e" />
<link rel="stylesheet" type="text/css" href="_static/plot_directive.css" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=2ccfc426"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<script type="module">import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11.12.1/dist/mermaid.esm.min.mjs";
const initStyles = () => {
const defaultStyle = document.createElement('style');
defaultStyle.textContent = `pre.mermaid {
/* Same as .mermaid-container > pre */
display: block;
width: 100%;
}
pre.mermaid > svg {
/* Same as .mermaid-container > pre > svg */
height: 500px;
width: 100%;
max-width: 100% !important;
}`;
document.head.appendChild(defaultStyle);
const fullscreenStyle = document.createElement('style');
fullscreenStyle.textContent = `.mermaid-container {
display: flex;
flex-direction: row;
width: 100%;
}
.mermaid-container > pre {
display: block;
width: 100%;
}
.mermaid-container > pre > svg {
height: 500px;
width: 100%;
max-width: 100% !important;
}
.mermaid-fullscreen-btn {
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
font-size: 14px;
line-height: 1;
padding: 0;
color: #333;
}
.mermaid-fullscreen-btn:hover {
opacity: 100% !important;
background: rgba(255, 255, 255, 1);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
transform: scale(1.1);
}
.mermaid-fullscreen-btn.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.3);
color: #e0e0e0;
}
.mermaid-fullscreen-btn.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 3px 10px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal {
display: none;
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
padding: 20px;
overflow: auto;
}
.mermaid-fullscreen-modal.dark-theme {
background: rgba(0, 0, 0, 0.98);
}
.mermaid-fullscreen-modal.active {
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
max-width: 95vw;
max-height: 90vh;
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
overflow: auto;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen .mermaid svg {
height: 100% !important;
width: 100% !important;
cursor: grab;
}
.mermaid-fullscreen-close {
position: fixed !important;
top: 20px !important;
right: 20px !important;
width: 40px;
height: 40px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 50%;
cursor: pointer;
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.2s;
font-size: 24px;
line-height: 1;
color: #333;
}
.mermaid-fullscreen-close:hover {
background: white;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
transform: scale(1.1);
}
.mermaid-fullscreen-close.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.2);
color: #e0e0e0;
}
.mermaid-fullscreen-close.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 6px 16px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
}`;
document.head.appendChild(fullscreenStyle);
}
// Detect if page has dark background
const isDarkTheme = () => {
// We use a set of heuristics:
// 1. Check for common dark mode classes or attributes
// 2. Check computed background color brightness
if (document.documentElement.classList.contains('dark') ||
document.documentElement.getAttribute('data-theme') === 'dark' ||
document.body.classList.contains('dark') ||
document.body.getAttribute('data-theme') === 'dark') {
// console.log("Dark theme detected via class/attribute");
return true;
}
if (document.documentElement.classList.contains('light') ||
document.documentElement.getAttribute('data-theme') === 'light' ||
document.body.classList.contains('light') ||
document.body.getAttribute('data-theme') === 'light') {
// console.log("Light theme detected via class/attribute");
return false;
}
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
// console.log("Dark theme detected via prefers-color-scheme");
return true;
}
const bgColor = window.getComputedStyle(document.body).backgroundColor;
const match = bgColor.match(/rgb\((\d+),\s*(\d+),\s*(\d+)/);
if (match) {
const r = parseInt(match[1]);
const g = parseInt(match[2]);
const b = parseInt(match[3]);
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
// console.log("Background color brightness:", brightness);
return brightness < 128;
}
// console.log("No dark or light theme detected, defaulting to light theme");
return false;
};
let darkTheme = isDarkTheme();
let modal = null;
let modalContent = null;
let previousScrollOffset = [window.scrollX, window.scrollY];
const runMermaid = async (rerun) => {
console.log("Running mermaid diagrams, rerun =", rerun);
// clear all existing mermaid charts
let all_mermaids = document.querySelectorAll(".mermaid");
if (rerun) {
all_mermaids.forEach((el) => {
if(!el.hasAttribute("data-original-code")) {
// store original code
// console.log(`Storing original code for first run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
if(el.getAttribute("data-processed") === "true") {
// remove and restore original
el.removeAttribute("data-processed");
// console.log(`Restoring original code for re-run: `, el.getAttribute('data-original-code'));
el.innerHTML = el.getAttribute('data-original-code');
} else {
// store original code
// console.log(`Storing original code for re-run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
});
await mermaid.run();
}
all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
if ("False" === "True") {
const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
if(mermaids_to_add_zoom > 0) {
var svgs = d3.selectAll("");
if(all_mermaids.length !== mermaids_processed.length) {
setTimeout(() => runMermaid(false), 200);
return;
} else if(svgs.size() !== mermaids_to_add_zoom) {
setTimeout(() => runMermaid(false), 200);
return;
} else {
svgs.each(function() {
var svg = d3.select(this);
svg.html("<g class='wrapper'>" + svg.html() + "</g>");
var inner = svg.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svg.call(zoom);
});
}
}
} else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
setTimeout(() => runMermaid(false), 200);
return;
}
// Stop here if not adding fullscreen capability
if ("True" !== "True") return;
if (modal !== null ) {
// Destroy existing modal
modal.remove();
modal = null;
modalContent = null;
}
modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
modal.setAttribute('aria-modal', 'true');
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen"></button>
<div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
document.body.style.overflow = ''
window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
modal.addEventListener('click', (e) => {
if (e.target === modal) closeModal();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modal.classList.contains('active')) {
closeModal();
}
});
document.querySelectorAll('.mermaid').forEach((mermaidDiv) => {
if (mermaidDiv.parentNode.classList.contains('mermaid-container') ||
mermaidDiv.closest('.mermaid-fullscreen-modal')) {
// Already processed, adjust button class if needed
const existingBtn = mermaidDiv.parentNode.querySelector('.mermaid-fullscreen-btn');
if (existingBtn) {
existingBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
}
return;
}
const container = document.createElement('div');
container.className = 'mermaid-container';
mermaidDiv.parentNode.insertBefore(container, mermaidDiv);
container.appendChild(mermaidDiv);
const fullscreenBtn = document.createElement('button');
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
const marginTop = parseFloat(diagramStyle.marginTop) || 0;
const marginRight = parseFloat(diagramStyle.marginRight) || 0;
const paddingTop = parseFloat(diagramStyle.paddingTop) || 0;
const paddingRight = parseFloat(diagramStyle.paddingRight) || 0;
fullscreenBtn.style.top = `${marginTop + paddingTop + 4}px`;
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
const svg = clone.querySelector('svg');
if (svg) {
svg.removeAttribute('width');
svg.removeAttribute('height');
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
svg.style.sdisplay = 'block';
if ("False" === "True") {
setTimeout(() => {
const g = svg.querySelector('g');
if (g) {
var svgD3 = d3.select(svg);
svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
var inner = svgD3.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svgD3.call(zoom);
}
}, 100);
}
}
modal.classList.add('active');
document.body.style.overflow = 'hidden';
});
container.appendChild(fullscreenBtn);
});
};
const load = async () => {
initStyles();
await runMermaid(true);
const reRunIfThemeChanges = async () => {
const newDarkTheme = isDarkTheme();
if (newDarkTheme !== darkTheme) {
darkTheme = newDarkTheme;
console.log("Theme change detected, re-running mermaid with", darkTheme ? "dark" : "default", "theme");
await mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
await runMermaid(true);
}
};
// Update theme classes when theme changes
const themeObserver = new MutationObserver(reRunIfThemeChanges);
themeObserver.observe(document.documentElement, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
themeObserver.observe(document.body, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
};
console.log("Initializing mermaid with", darkTheme ? "dark" : "default", "theme");
mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
window.addEventListener("load", load);</script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="索引" href="#" />
<link rel="search" title="搜索" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Class Boru
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="chiken_rabbit.html">鸡兔同笼问题</a></li>
<li class="toctree-l1"><a class="reference internal" href="gcd_lcm.html">最大公约数与最小公倍数</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Class Boru</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="页面导航">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">索引</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1 id="index">索引</h1>
<div class="genindex-jumpbox">
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; 版权所有 2026, Milse Sui。</p>
</div>
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
<a href="https://readthedocs.org">Read the Docs</a> 开发.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

138
index.html Normal file
View File

@ -0,0 +1,138 @@
<!DOCTYPE html>
<html class="writer-html5" lang="zh" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Class Boru &mdash; Class Boru 文档</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=9edc463e" />
<link rel="stylesheet" type="text/css" href="_static/plot_directive.css" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=2ccfc426"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="search.html" />
<link rel="next" title="鸡兔同笼问题" href="chiken_rabbit.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="#" class="icon icon-home">
Class Boru
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="chiken_rabbit.html">鸡兔同笼问题</a></li>
<li class="toctree-l1"><a class="reference internal" href="gcd_lcm.html">最大公约数与最小公倍数</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="#">Class Boru</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="页面导航">
<ul class="wy-breadcrumbs">
<li><a href="#" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Class Boru</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/index.rst.txt" rel="nofollow"> 查看页面源码</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="class-boru">
<h1>Class Boru<a class="headerlink" href="#class-boru" title="Link to this heading"></a></h1>
<div class="toctree-wrapper compound">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="chiken_rabbit.html">鸡兔同笼问题</a><ul>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id2">第一部分:故事引入</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id3">第二部分:直观观察</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id6">第三部分:解法一(假设法,适合低年级)</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id9">第四部分:解法二(代入法,适合中年级)</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id12">第五部分:解法三(方程法,适合高年级)</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id15">第六部分:方法比较</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id18">第七部分:互动练习</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id24">第八部分:小结</a></li>
<li class="toctree-l2"><a class="reference internal" href="chiken_rabbit.html#id28">思考题</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="gcd_lcm.html">最大公约数与最小公倍数</a><ul>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id2">第一部分:故事引入</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id3">第二部分:直观观察</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id6">第三部分:解法一(列举法,适合低年级)</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id10">第四部分:解法二(短除法,适合中年级)</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id14">第五部分:解法三(质因数分解法,适合高年级)</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id18">第六部分:方法比较</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id21">第七部分:互动练习</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id27">第八部分:小结</a></li>
<li class="toctree-l2"><a class="reference internal" href="gcd_lcm.html#id32">思考题</a></li>
</ul>
</li>
</ul>
</div>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="页脚">
<a href="chiken_rabbit.html" class="btn btn-neutral float-right" title="鸡兔同笼问题" accesskey="n" rel="next">下一页 <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; 版权所有 2026, Milse Sui。</p>
</div>
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
<a href="https://readthedocs.org">Read the Docs</a> 开发.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

BIN
objects.inv Normal file

Binary file not shown.

557
search.html Normal file
View File

@ -0,0 +1,557 @@
<!DOCTYPE html>
<html class="writer-html5" lang="zh" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>搜索 &mdash; Class Boru 文档</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=b86133f3" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=9edc463e" />
<link rel="stylesheet" type="text/css" href="_static/plot_directive.css" />
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=2ccfc426"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<script type="module">import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11.12.1/dist/mermaid.esm.min.mjs";
const initStyles = () => {
const defaultStyle = document.createElement('style');
defaultStyle.textContent = `pre.mermaid {
/* Same as .mermaid-container > pre */
display: block;
width: 100%;
}
pre.mermaid > svg {
/* Same as .mermaid-container > pre > svg */
height: 500px;
width: 100%;
max-width: 100% !important;
}`;
document.head.appendChild(defaultStyle);
const fullscreenStyle = document.createElement('style');
fullscreenStyle.textContent = `.mermaid-container {
display: flex;
flex-direction: row;
width: 100%;
}
.mermaid-container > pre {
display: block;
width: 100%;
}
.mermaid-container > pre > svg {
height: 500px;
width: 100%;
max-width: 100% !important;
}
.mermaid-fullscreen-btn {
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
font-size: 14px;
line-height: 1;
padding: 0;
color: #333;
}
.mermaid-fullscreen-btn:hover {
opacity: 100% !important;
background: rgba(255, 255, 255, 1);
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
transform: scale(1.1);
}
.mermaid-fullscreen-btn.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.3);
color: #e0e0e0;
}
.mermaid-fullscreen-btn.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 3px 10px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal {
display: none;
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
padding: 20px;
overflow: auto;
}
.mermaid-fullscreen-modal.dark-theme {
background: rgba(0, 0, 0, 0.98);
}
.mermaid-fullscreen-modal.active {
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
max-width: 95vw;
max-height: 90vh;
background: white;
border-radius: 8px;
padding: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
overflow: auto;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.mermaid-container-fullscreen .mermaid svg {
height: 100% !important;
width: 100% !important;
cursor: grab;
}
.mermaid-fullscreen-close {
position: fixed !important;
top: 20px !important;
right: 20px !important;
width: 40px;
height: 40px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 50%;
cursor: pointer;
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.2s;
font-size: 24px;
line-height: 1;
color: #333;
}
.mermaid-fullscreen-close:hover {
background: white;
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
transform: scale(1.1);
}
.mermaid-fullscreen-close.dark-theme {
background: rgba(50, 50, 50, 0.95);
border: 1px solid rgba(255, 255, 255, 0.2);
color: #e0e0e0;
}
.mermaid-fullscreen-close.dark-theme:hover {
background: rgba(60, 60, 60, 1);
box-shadow: 0 6px 16px rgba(255, 255, 255, 0.2);
}
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
}`;
document.head.appendChild(fullscreenStyle);
}
// Detect if page has dark background
const isDarkTheme = () => {
// We use a set of heuristics:
// 1. Check for common dark mode classes or attributes
// 2. Check computed background color brightness
if (document.documentElement.classList.contains('dark') ||
document.documentElement.getAttribute('data-theme') === 'dark' ||
document.body.classList.contains('dark') ||
document.body.getAttribute('data-theme') === 'dark') {
// console.log("Dark theme detected via class/attribute");
return true;
}
if (document.documentElement.classList.contains('light') ||
document.documentElement.getAttribute('data-theme') === 'light' ||
document.body.classList.contains('light') ||
document.body.getAttribute('data-theme') === 'light') {
// console.log("Light theme detected via class/attribute");
return false;
}
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
// console.log("Dark theme detected via prefers-color-scheme");
return true;
}
const bgColor = window.getComputedStyle(document.body).backgroundColor;
const match = bgColor.match(/rgb\((\d+),\s*(\d+),\s*(\d+)/);
if (match) {
const r = parseInt(match[1]);
const g = parseInt(match[2]);
const b = parseInt(match[3]);
const brightness = (r * 299 + g * 587 + b * 114) / 1000;
// console.log("Background color brightness:", brightness);
return brightness < 128;
}
// console.log("No dark or light theme detected, defaulting to light theme");
return false;
};
let darkTheme = isDarkTheme();
let modal = null;
let modalContent = null;
let previousScrollOffset = [window.scrollX, window.scrollY];
const runMermaid = async (rerun) => {
console.log("Running mermaid diagrams, rerun =", rerun);
// clear all existing mermaid charts
let all_mermaids = document.querySelectorAll(".mermaid");
if (rerun) {
all_mermaids.forEach((el) => {
if(!el.hasAttribute("data-original-code")) {
// store original code
// console.log(`Storing original code for first run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
if(el.getAttribute("data-processed") === "true") {
// remove and restore original
el.removeAttribute("data-processed");
// console.log(`Restoring original code for re-run: `, el.getAttribute('data-original-code'));
el.innerHTML = el.getAttribute('data-original-code');
} else {
// store original code
// console.log(`Storing original code for re-run: `, el.innerHTML);
el.setAttribute('data-original-code', el.innerHTML);
}
});
await mermaid.run();
}
all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
if ("False" === "True") {
const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
if(mermaids_to_add_zoom > 0) {
var svgs = d3.selectAll("");
if(all_mermaids.length !== mermaids_processed.length) {
setTimeout(() => runMermaid(false), 200);
return;
} else if(svgs.size() !== mermaids_to_add_zoom) {
setTimeout(() => runMermaid(false), 200);
return;
} else {
svgs.each(function() {
var svg = d3.select(this);
svg.html("<g class='wrapper'>" + svg.html() + "</g>");
var inner = svg.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svg.call(zoom);
});
}
}
} else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
setTimeout(() => runMermaid(false), 200);
return;
}
// Stop here if not adding fullscreen capability
if ("True" !== "True") return;
if (modal !== null ) {
// Destroy existing modal
modal.remove();
modal = null;
modalContent = null;
}
modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
modal.setAttribute('aria-modal', 'true');
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen"></button>
<div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
document.body.style.overflow = ''
window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
modal.addEventListener('click', (e) => {
if (e.target === modal) closeModal();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && modal.classList.contains('active')) {
closeModal();
}
});
document.querySelectorAll('.mermaid').forEach((mermaidDiv) => {
if (mermaidDiv.parentNode.classList.contains('mermaid-container') ||
mermaidDiv.closest('.mermaid-fullscreen-modal')) {
// Already processed, adjust button class if needed
const existingBtn = mermaidDiv.parentNode.querySelector('.mermaid-fullscreen-btn');
if (existingBtn) {
existingBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
}
return;
}
const container = document.createElement('div');
container.className = 'mermaid-container';
mermaidDiv.parentNode.insertBefore(container, mermaidDiv);
container.appendChild(mermaidDiv);
const fullscreenBtn = document.createElement('button');
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
const marginTop = parseFloat(diagramStyle.marginTop) || 0;
const marginRight = parseFloat(diagramStyle.marginRight) || 0;
const paddingTop = parseFloat(diagramStyle.paddingTop) || 0;
const paddingRight = parseFloat(diagramStyle.paddingRight) || 0;
fullscreenBtn.style.top = `${marginTop + paddingTop + 4}px`;
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
const svg = clone.querySelector('svg');
if (svg) {
svg.removeAttribute('width');
svg.removeAttribute('height');
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
svg.style.sdisplay = 'block';
if ("False" === "True") {
setTimeout(() => {
const g = svg.querySelector('g');
if (g) {
var svgD3 = d3.select(svg);
svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
var inner = svgD3.select("g");
var zoom = d3.zoom().on("zoom", function(event) {
inner.attr("transform", event.transform);
});
svgD3.call(zoom);
}
}, 100);
}
}
modal.classList.add('active');
document.body.style.overflow = 'hidden';
});
container.appendChild(fullscreenBtn);
});
};
const load = async () => {
initStyles();
await runMermaid(true);
const reRunIfThemeChanges = async () => {
const newDarkTheme = isDarkTheme();
if (newDarkTheme !== darkTheme) {
darkTheme = newDarkTheme;
console.log("Theme change detected, re-running mermaid with", darkTheme ? "dark" : "default", "theme");
await mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
await runMermaid(true);
}
};
// Update theme classes when theme changes
const themeObserver = new MutationObserver(reRunIfThemeChanges);
themeObserver.observe(document.documentElement, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
themeObserver.observe(document.body, {
attributes: true,
attributeFilter: ['class', 'style', 'data-theme']
});
};
console.log("Initializing mermaid with", darkTheme ? "dark" : "default", "theme");
mermaid.initialize(
{...JSON.parse(
`{"startOnLoad": false}`
),
...{ darkMode: darkTheme, theme: darkTheme ? 'dark' : 'default' },
}
);
window.addEventListener("load", load);</script>
<script src="_static/js/theme.js"></script>
<script src="_static/searchtools.js"></script>
<script src="_static/language_data.js"></script>
<link rel="index" title="索引" href="genindex.html" />
<link rel="search" title="搜索" href="#" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
Class Boru
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="#" method="get">
<input type="text" name="q" placeholder="搜索文档" aria-label="搜索文档" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="导航菜单">
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="chiken_rabbit.html">鸡兔同笼问题</a></li>
<li class="toctree-l1"><a class="reference internal" href="gcd_lcm.html">最大公约数与最小公倍数</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="移动版导航菜单" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Class Boru</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="页面导航">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">搜索</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
请启用 JavaScript 以便使用搜索功能
</p>
</div>
</noscript>
<div id="search-results">
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>&#169; 版权所有 2026, Milse Sui。</p>
</div>
利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用的
<a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
<a href="https://readthedocs.org">Read the Docs</a> 开发.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
<script>
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script id="searchindexloader"></script>
</body>
</html>

1
searchindex.js Normal file
View File

@ -0,0 +1 @@
Search.setIndex({"alltitles":{"Class Boru":[[2,null]],"Contents:":[[2,null]],"\u5206\u89e3\u8d28\u56e0\u6570":[[1,"id16"]],"\u52a8\u7269\u7279\u5f81\u5bf9\u6bd4":[[0,"id4"]],"\u57fa\u672c\u6982\u5ff5":[[1,"id4"]],"\u5df2\u77e5\u6761\u4ef6\u4e0e\u76ee\u6807":[[0,"id5"]],"\u601d\u8003\u9898":[[0,"id28"],[1,"id32"]],"\u65b9\u6cd5\u5bf9\u6bd4":[[0,"id16"],[1,"id19"]],"\u65b9\u6cd5\u9009\u62e9":[[1,"id20"]],"\u6700\u5927\u516c\u7ea6\u6570\u4e0e\u6700\u5c0f\u516c\u500d\u6570":[[1,null]],"\u6838\u5fc3\u601d\u8def":[[0,"id7"],[0,"id10"],[0,"id13"],[1,"id7"],[1,"id11"],[1,"id15"]],"\u6b8a\u9014\u540c\u5f52":[[0,"id17"]],"\u6c42\u6700\u5927\u516c\u7ea6\u6570":[[1,"id12"]],"\u6c42\u6700\u5927\u516c\u7ea6\u6570\u6b65\u9aa4":[[1,"id8"]],"\u6c42\u6700\u5c0f\u516c\u500d\u6570":[[1,"id13"]],"\u6c42\u6700\u5c0f\u516c\u500d\u6570\u6b65\u9aa4":[[1,"id9"]],"\u77e5\u8bc6\u7ed3\u6784":[[0,"id25"],[1,"id28"]],"\u7b2c\u4e00\u90e8\u5206\uff1a\u6545\u4e8b\u5f15\u5165":[[0,"id2"],[1,"id2"]],"\u7b2c\u4e03\u90e8\u5206\uff1a\u4e92\u52a8\u7ec3\u4e60":[[0,"id18"],[1,"id21"]],"\u7b2c\u4e09\u90e8\u5206\uff1a\u89e3\u6cd5\u4e00\uff08\u5047\u8bbe\u6cd5\uff0c\u9002\u5408\u4f4e\u5e74\u7ea7\uff09":[[0,"id6"]],"\u7b2c\u4e09\u90e8\u5206\uff1a\u89e3\u6cd5\u4e00\uff08\u5217\u4e3e\u6cd5\uff0c\u9002\u5408\u4f4e\u5e74\u7ea7\uff09":[[1,"id6"]],"\u7b2c\u4e8c\u90e8\u5206\uff1a\u76f4\u89c2\u89c2\u5bdf":[[0,"id3"],[1,"id3"]],"\u7b2c\u4e94\u90e8\u5206\uff1a\u89e3\u6cd5\u4e09\uff08\u65b9\u7a0b\u6cd5\uff0c\u9002\u5408\u9ad8\u5e74\u7ea7\uff09":[[0,"id12"]],"\u7b2c\u4e94\u90e8\u5206\uff1a\u89e3\u6cd5\u4e09\uff08\u8d28\u56e0\u6570\u5206\u89e3\u6cd5\uff0c\u9002\u5408\u9ad8\u5e74\u7ea7\uff09":[[1,"id14"]],"\u7b2c\u516b\u90e8\u5206\uff1a\u5c0f\u7ed3":[[0,"id24"],[1,"id27"]],"\u7b2c\u516d\u90e8\u5206\uff1a\u65b9\u6cd5\u6bd4\u8f83":[[0,"id15"],[1,"id18"]],"\u7b2c\u56db\u90e8\u5206\uff1a\u89e3\u6cd5\u4e8c\uff08\u4ee3\u5165\u6cd5\uff0c\u9002\u5408\u4e2d\u5e74\u7ea7\uff09":[[0,"id9"]],"\u7b2c\u56db\u90e8\u5206\uff1a\u89e3\u6cd5\u4e8c\uff08\u77ed\u9664\u6cd5\uff0c\u9002\u5408\u4e2d\u5e74\u7ea7\uff09":[[1,"id10"]],"\u7ea6\u6570\u4e0e\u500d\u6570\u5173\u7cfb":[[1,"id5"]],"\u8981\u70b9\u603b\u7ed3":[[0,"id27"],[1,"id31"]],"\u89e3\u9898\u6b65\u9aa4":[[0,"id26"],[1,"id30"]],"\u8be6\u7ec6\u6b65\u9aa4":[[0,"id8"],[0,"id11"],[0,"id14"]],"\u91cd\u8981\u516c\u5f0f":[[1,"id29"]],"\u91cd\u8981\u5173\u7cfb":[[1,"id17"]],"\u9898 1: \u57fa\u7840\u9898":[[1,"id22"]],"\u9898 1: \u9e21\u5154\u540c\u7b3c\u95ee\u9898\uff08\u53d8\u5f0f\uff09":[[0,"id19"]],"\u9898 2: \u5e94\u7528\u9898\uff08\u5206\u7cd6\u679c\uff09":[[1,"id23"]],"\u9898 2: \u684c\u6905\u95ee\u9898":[[0,"id20"]],"\u9898 3: \u5e94\u7528\u9898\uff08\u53d1\u8f66\u95ee\u9898\uff09":[[1,"id24"]],"\u9898 3: \u94c5\u7b14\u548c\u94a2\u7b14\u95ee\u9898":[[0,"id21"]],"\u9898 4: \u516c\u4ea4\u8f66\u548c\u5c0f\u6c7d\u8f66\u95ee\u9898":[[0,"id22"]],"\u9898 4: \u8fdb\u9636\u9898":[[1,"id25"]],"\u9898 5: \u7efc\u5408\u5e94\u7528\u9898":[[1,"id26"]],"\u9898 5: \u9e21\u5154\u9e2d\u540c\u7b3c\u95ee\u9898\uff08\u8fdb\u9636\uff09":[[0,"id23"]],"\u9e21\u5154\u540c\u7b3c\u95ee\u9898":[[0,null]]},"docnames":["chiken_rabbit","gcd_lcm","index"],"envversion":{"sphinx":65,"sphinx.domains.c":3,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":9,"sphinx.domains.index":1,"sphinx.domains.javascript":3,"sphinx.domains.math":2,"sphinx.domains.python":4,"sphinx.domains.rst":2,"sphinx.domains.std":2},"filenames":["chiken_rabbit.rst","gcd_lcm.rst","index.rst"],"indexentries":{},"objects":{},"objnames":{},"objtypes":{},"terms":{"10":[0,1],"100":0,"12":[0,1],"130":0,"14":0,"140":0,"15":0,"16":1,"160":0,"18":1,"180":1,"20":0,"23":0,"24":[0,1],"240":1,"25":0,"296":0,"2x":0,"2z":0,"30":[0,1],"32":1,"35":0,"36":1,"3y":0,"40":0,"40x":0,"432":1,"46":0,"48":[0,1],"4x":0,"4y":0,"60":0,"70":0,"72":1,"80":0,"94":0,"begin":0,"case":0,"code":0,"end":0,"frac":0,"gcd":1,"hire":0,"lcm":1,"pdf":0,"png":0,"quad":0,"sourc":0,"text":0,"time":0},"titles":["\u9e21\u5154\u540c\u7b3c\u95ee\u9898","\u6700\u5927\u516c\u7ea6\u6570\u4e0e\u6700\u5c0f\u516c\u500d\u6570","Class Boru"],"titleterms":{"boru":2,"class":2,"content":2}})