module Algebra::PolynomialFactorization

Public Instance Methods

factorize() click to toggle source
# File lib/algebra/polynomial-factor.rb, line 55
def factorize
  return Algebra::Factors.new([[zero, 1]]) if zero?
  fact0 = if ground <= Integer
            factorize_int
          elsif defined?(Rational) && ground <= Rational ||
                defined?(Algebra::LocalizedRing) && ground <= Algebra::LocalizedRing
            factorize_rational
          elsif defined?(Algebra::ResidueClassRing) && ground <= Algebra::ResidueClassRing
            if ground.ground <= Integer
              factorize_modp
            else
              factorize_alg
            end
          elsif ground <= Algebra::Polynomial
            require 'algebra/m-polynomial-factor'
            require 'algebra/polynomial-converter'
            mp = self.class.convert_to(Algebra::MPolynomial)
            f = value_on(mp)
            fact = f.factorize
            fact.map { |g| g.value_on(self.class) }
          else
            raise "(factor) unknown data type : #{self.class}"
          end
  fact0.normalize!
end
irreducible?() click to toggle source
# File lib/algebra/polynomial-factor.rb, line 81
def irreducible?
  factorize.size == 1
end
monic_int(a = lc) click to toggle source
# File lib/algebra/polynomial-factor.rb, line 28
def monic_int(a = lc)
  d = deg
  project(self.class) do |c, n|
    if n == d
      ground.unity
    elsif n < d
      c * a**(d - 1 - n)
    else
      #     p [self, d, n];     exit
      raise
    end
  end
end
monic_int_rev(a) click to toggle source
# File lib/algebra/polynomial-factor.rb, line 42
def monic_int_rev(a)
  d = deg
  project(self.class) do |c, n|
    if n == d
      a
    elsif n < d
      c / a**(d - 1 - n)
    else
      raise
    end
  end
end
psqfree?() click to toggle source
# File lib/algebra/polynomial-factor.rb, line 24
def psqfree?
  pgcd(derivate).deg <= 0
end
sqfree() click to toggle source
# File lib/algebra/polynomial-factor.rb, line 14
def sqfree
  f = self
  g = gcd(derivate)
  f / g * g.lc
end
sqfree?() click to toggle source
# File lib/algebra/polynomial-factor.rb, line 20
def sqfree?
  gcd(derivate).deg <= 0
end