// 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..