| 392 | } |
| 393 | |
| 394 | int Decode(int max_count, uint64_t* out) const override |
| 395 | { |
| 396 | auto all_syndromes = ReconstructAllSyndromes(m_syndromes, m_field); |
| 397 | auto poly = BerlekampMassey(all_syndromes, max_count, m_field); |
| 398 | if (poly.size() == 0) return -1; |
| 399 | if (poly.size() == 1) return 0; |
| 400 | if ((int)poly.size() > 1 + max_count) return -1; |
| 401 | std::reverse(poly.begin(), poly.end()); |
| 402 | auto roots = FindRoots(poly, m_basis, m_field); |
| 403 | if (roots.size() == 0) return -1; |
| 404 | |
| 405 | for (const auto& root : roots) { |
| 406 | *(out++) = m_field.ToUint64(root); |
| 407 | } |
| 408 | return roots.size(); |
| 409 | } |
| 410 | |
| 411 | size_t Merge(const Sketch* other_sketch) override |
| 412 | { |