I am trying to implement euclidian polynomials gcd using boost library. It compiles. However, I got segmentation fault on the runtime.
This is my code:
polynomial<double> gcd_euclid(polynomial<double> const &a, polynomial<double> const &b){
polynomial<double> s, old_t = zero_element(std::multiplies<polynomial<double>>());
polynomial<double> old_s, t = identity_element(std::multiplies<polynomial<double>>()); 
polynomial<double> r = b; 
polynomial<double> old_r = a;
while (r != zero_element(std::multiplies<polynomial<double>>())) {
    polynomial<double> quotient = old_r / r;
    old_r = r; 
    r = old_r - quotient * r;
    old_s = s;
    s = old_s - quotient * s;
    old_t = t;
    t = old_t - quotient * t;
}
return old_r;
}
Using gdb, it traces the segfault to this part in the polynomial.hpp:
 template <class U>
 polynomial& operator *=(const polynomial<U>& value)
 {
  // TODO: FIXME: use O(N log(N)) algorithm!!!
  polynomial const zero = zero_element(std::multiplies<polynomial>());
  if (value == zero)
  {
      *this = zero;
      return *this;
  }
  polynomial base(*this);
  this->multiplication(value[0]);
  for(size_type i = 1; i < value.size(); ++i)
  {
     polynomial t(base);
     t.multiplication(value[i]);
     size_type s = size() - i;
     for(size_type j = 0; j < s; ++j)
     {
        m_data[i+j] += t[j];
     }
     for(size_type j = s; j < t.size(); ++j)
        m_data.push_back(t[j]);
  }
  return *this;
}
specifically this line:
 m_data[i+j] += t[j];
Aucun commentaire:
Enregistrer un commentaire