Phân hoạch (partition)
Các phân hoạch (partitions)
$$\lambda_1 \geq \lambda_2 \geq \dots \geq \lambda_r$$$$ n = \lambda_1 + \dots + \lambda_r .$$Tham khảo chủ yếu từ https://docs.oscar-system.org/stable/Combinatorics/EnumerativeCombinatorics/partitions/#partition
Các $\lambda_i$ được gọi là các phần tử (part) của phân hoạch và $r$ được gọi là độ dài (length). Tham khảo thêm tại Ful97 và Knu11, Mục 7.2.1.4.
Một phân hoạch có thể được mã hóa (encoded) dưới dạng một mảng (array) với các phần tử (element) là $\lambda_i$.
OSCAR cung cấp kiểu tham số (parametric type) Partition{T}
và đây là một kiểu con (subtype) của AbstractVector{T}
.
Ở đây, T
có thể là bất kì kiểu con nào của IntegerUnion
.
Hiệu suất không bị hảnh hưởng khi sử dụng kiểu riêng cho phân hoạch thay vì chỉ sử dụng mảng.
Kiểu tham số này cho phép tăng hiệu suất bằng cách sử dụng các kiểu số nguyên nhỏ hơn.
|
|
Bởi vì Partition
là một kiểu con của AbstractVector
, nên tất cả các hàm có thể được sử dụng cho vector (mảng một chiều) cũng có thể được sử dụng cho các phân hoạch.
|
|
Tuy nhiên, thông thường, $|\lambda| := n$ được gọi là kích cỡ (size) của $\lambda$.
Trong Julia, hàm size
cho mảng đã tồn tại và trả về kích cỡ của mảng.
Thay vào đó, bạn có thể sử dụng hàm sum
của Julia để lấy tổng của các phần tử.
|
|
Trong các thuật toán liên quan đến phân hoạch, sẽ có lúc ta truy cập các phần tử vượt quá độ dài của phân hoạch. Để thuận tiện, ta thường kì vọng nhận giá trị bằng 0 thay vì bị bắt lỗi.
Vì vậy, OSCAR cung cấp hàm getindex_safe
:
|
|
Nếu bạn chắc chắn rằng P[i]
tồn tại, hãy sử dụng getindex
vì hàm này sẽ nhanh hơn.
Sinh (generate) và đếm (count) phân hoạch
|
|
Để đếm phân hoạch, ta sử dụng công thức Hardy-Ramanujan-Rademachen, chi tiết Joh12. Xem thêm Knu11, Mục 7.2.1.4 và OEIS, A000041.
Phân hoạch với các hạn chế (restrictions)
|
|
và có 4562 cách cho câu hỏi thứ nhất trong bài tập:
|
|
Bài toán gốc “Cách đổi một đô la” có 292 cách giải:
|
|
|
|
Để đếm phân hoạch, ta sử dụng quan hệ hồi quy (recurrence relation)
$$p_k(n) = p_{k - 1}(n - 1) + p_k(n - k),$$trong đó $p_k(n)$ biểu thị số lượng phân hoạch của $n$ thành $k$ phần tử (part); xem Knu11, Mục 7.2.1.4, Phương trình (39), và cũng xem OEIS, A008284.
|
|
Các phép toán (operations)
Liên hợp (conjugate) của một phân hoạch $\lambda$ được tính bằng cách xét biểu đồ Young (Young diagram) của nó (xem Tableaux) và sau đó lật nó dọc theo đường chéo chính, xem Ful97, trang 2, và Knu11, Mục 7.2.1.4.
|
|
Các Quan hệ (relations)
$$\lambda_1 + \dots + \lambda_i \geq \mu_1 + \dots + \mu_i$$với mọi $i$.
Nếu $\lambda\trianglerighteq\mu$, người ta nói rằng $\lambda$ thống trị (dominate) $\mu$. Xem Ful97, trang 26, và Knu11, Mục 7.2.1.4, Bài tập 54.
Lưu ý rằng trong khi thứ tự từ điển (lexicographic oder) là một thứ tự toàn phần (total ordering), thứ tự thống trị không phải như vậy. Hơn nữa, Knu11 nói rằng áp đảo (majorize) thay vì thống trị (dominate) và sử dụng kí hiệu $\succeq$ thay vì $\trianglerighteq$.
|
|