// Reed-Solomon protection and verification.

import util { 비트배타합 }
import wire { 갈루아표 }

// 체에서 곱셈은 로그의 덧셈이다. 0은 로그가 없으므로 먼저 걸러낸다.
export function 갈루아곱(왼쪽: int, 오른쪽: int, 표: 갈루아표) -> int {
  if 왼쪽 == 0 || 오른쪽 == 0 { return 0 }
  표.지수[표.로그[왼쪽] + 표.로그[오른쪽]]
}

export function 다항식곱(왼쪽: Array<int>, 오른쪽: Array<int>, 표: 갈루아표) -> Array<int> {
  let mut 결과: Array<int> = []
  let mut 색인 = 0
  while 색인 < 왼쪽.length + 오른쪽.length - 1 { 결과.push(0); 색인 = 색인 + 1 }
  let mut 왼색인 = 0
  while 왼색인 < 왼쪽.length {
    let mut 오른색인 = 0
    while 오른색인 < 오른쪽.length {
      let 결과색인 = 왼색인 + 오른색인
      결과[결과색인] = 비트배타합(결과[결과색인], 갈루아곱(왼쪽[왼색인], 오른쪽[오른색인], 표), 8)
      오른색인 = 오른색인 + 1
    }
    왼색인 = 왼색인 + 1
  }
  결과
}
