// rs.mbt — Reed-Solomon 系统码编解码(K8 刀2)
//
// 系统阵:(k+m)×k,上 k 行 = 单位阵(数据片透传零开销),下 m 行 = Cauchy
// C[r][c] = 1/(x_r ⊕ y_c),x_r ∈ [k, k+m)、y_c ∈ [0, k) —— 两组元素不相交,
// 分母恒非零;Cauchy 阵保证任 k×k 子阵可逆(MDS),任意 ≤m 片抹除可恢复。
//
// 解码 = 存活片抽子阵 → GF 高斯消元求逆 → 重造数据片;冗余片由数据片
// 重编码复原(冗余是数据的函数,不单独做恢复数学)。
//
// 门(rs_wbtest.mbt):MDS 抹除穷举(小组合全部 ≤m 子集)+ LCG 财产门
// (k 1..20 × m 1..8,随机 ≤m 抹除逐字节复原)。
///|
/// RS(k+m) 编解码器(系统码:数据片透传,冗余片 = Cauchy 行 × 数据片)。
/// 判据:k ≥ 1,m ≥ 1,k+m ≤ 256(GF 域上限;Cauchy 的 x/y 两组取
/// [0, k+m) 不相交分割)。片长由调用面统一(刀3 垫片收口)。
pub struct RsCodec {
k : Int32
m : Int32
/// 系统阵 row-major:(k+m) 行 × k 列;上 k 行单位阵,下 m 行 Cauchy。
matrix : FixedArray[Int32]
}
///|
pub fn RsCodec::new(k : Int32, m : Int32) -> RsCodec {
if k < 1 || m < 1 || k + m > 256 {
abort(
"RsCodec::new: 组形越域 k=\{k} m=\{m}(判据:k≥1, m≥1, k+m≤256)",
)
}
let matrix : FixedArray[Int32] = FixedArray::make((k + m) * k, 0)
// 上 k 行单位阵
for i in 0.. Array[FixedArray[Byte]] {
let shard_len = data[0].length()
let parity : Array[FixedArray[Byte]] = []
for r in 0.. Array[FixedArray[Byte]]? {
// 单趟收集:存活下标与存活片(并行数组),免二次解包
let surviving : Array[Int32] = []
let ys : Array[FixedArray[Byte]] = []
let mut shard_len = -1
for i in 0.. {
if shard_len < 0 {
shard_len = s.length()
} else if s.length() != shard_len {
return None
}
surviving.push(i)
ys.push(s)
}
None => ()
}
}
if shard_len <= 0 || surviving.length() < self.k {
return None
}
// 抽 k×k 子阵(存活行),GF 高斯消元求逆
let sub = FixedArray::make(self.k * self.k, 0)
for r in 0.. inverse
None => return None
}
// 数据片:x = A⁻¹ · y(逐行:row = Σ inv[r][c] · y[c])
let data : Array[FixedArray[Byte]] = []
for r in 0.. FixedArray[Int32]? {
let width = 2 * n
// 增广 n × 2n:左 = a,右 = 单位阵
let aug : FixedArray[Int32] = FixedArray::make(n * width, 0)
for r in 0..