Thuật Toán Tính Can Chi Và Tàng Can Trong Bát Tự
Chuyên mục: Lập trình × Huyền học
Tính toán Bát Tự đòi hỏi nhiều thuật toán kết hợp: từ lịch thiên văn, modular arithmetic đến lookup table. Bài viết phân tích chi tiết cách lập trình tính 8 chữ Can Chi.
1. Trụ Năm — Lập Xuân Là Mốc
Sai lầm phổ biến nhất: dùng Tết Nguyên Đán làm mốc chuyển năm Can Chi. Thực tế, năm Can Chi bắt đầu từ Lập Xuân (立春), thường rơi vào 3-5/2 dương lịch.
function yearPillar(solarDate) {
const lichXuan = findSolarTerm(315, solarDate.year); // 315° = Lập Xuân
const year = solarDate < lichXuan
? solarDate.year - 1
: solarDate.year;
return {
stem: STEMS[(year - 4) % 10], // Giáp Tý = năm 4 CN
branch: BRANCHES[(year - 4) % 12]
};
}
2. Trụ Tháng — Tiết Khí Quyết Định
Tháng Can Chi không theo tháng âm lịch mà theo Tiết khí (節氣). Mỗi tháng bắt đầu từ một Tiết (không phải Trung khí):
- Tháng Dần (寅): Lập Xuân → Kinh Trập
- Tháng Mão (卯): Kinh Trập → Thanh Minh
- ... và tiếp tục theo 24 Tiết Khí
Thiên Can của tháng phụ thuộc vào Thiên Can năm theo quy luật Ngũ Hổ Độn (五虎遁):
// Ngũ Hổ Độn: Can năm → Can tháng Giêng (Dần)
const NGU_HO_DON = {
'甲': '丙', '己': '丙', // Giáp/Kỷ → Bính Dần
'乙': '戊', '庚': '戊', // Ất/Canh → Mậu Dần
'丙': '庚', '辛': '庚', // Bính/Tân → Canh Dần
'丁': '壬', '壬': '壬', // Đinh/Nhâm → Nhâm Dần
'戊': '甲', '癸': '甲', // Mậu/Quý → Giáp Dần
};
3. Trụ Ngày — Bảng Tra Julian Day
Can Chi ngày không có quy luật toán học đơn giản vì chu kỳ 60 ngày không chia hết cho năm. Cách tính phổ biến nhất dùng Julian Day Number:
function dayPillar(year, month, day) {
const jdn = julianDayNumber(year, month, day);
const idx = (jdn + 9) % 60; // offset cho Giáp Tý
return {
stem: STEMS[idx % 10],
branch: BRANCHES[idx % 12]
};
}
4. Trụ Giờ — Ngũ Thử Độn
Tương tự Ngũ Hổ Độn, Thiên Can của giờ phụ thuộc vào Can ngày theo quy luật Ngũ Thử Độn (五鼠遁). Mỗi ngày chia thành 12 thời thần (2 giờ mỗi thời thần), bắt đầu từ giờ Tý (23:00-01:00).
5. Tàng Can — Lookup Table
Tàng Can là bảng tra cố định, mỗi Địa Chi chứa 1-3 Thiên Can ẩn với tỷ lệ ảnh hưởng:
const TANG_CAN = {
'子': [['癸', 100]],
'丑': [['己', 60], ['癸', 30], ['辛', 10]],
'寅': [['甲', 60], ['丙', 30], ['戊', 10]],
'卯': [['乙', 100]],
'辰': [['戊', 60], ['乙', 30], ['癸', 10]],
'巳': [['丙', 60], ['庚', 30], ['戊', 10]],
'午': [['丁', 70], ['己', 30]],
'未': [['己', 60], ['丁', 30], ['乙', 10]],
'申': [['庚', 60], ['壬', 30], ['戊', 10]],
'酉': [['辛', 100]],
'戌': [['戊', 60], ['辛', 30], ['丁', 10]],
'亥': [['壬', 70], ['甲', 30]],
};
6. Thập Thần — Relationship Matrix
Thập Thần là ma trận quan hệ 10×5 giữa Nhật Chủ và các Can khác, xác định bằng: (a) cùng/khác hành, (b) sinh/khắc, (c) cùng/khác âm dương. Toàn bộ logic chỉ cần 1 hàm với 3 điều kiện if-else.