class_docstr: Abstract base class for ideals.
  
  Do not instantiate - use explicit constructors in the ring class instead:
  
  >>> from sympy import QQ
  >>> from sympy.abc import x
  >>> QQ.old_poly_ring(x).ideal(x+1)
  <x + 1>
  
  Attributes
  
  - ring - the ring this ideal belongs to
  
  Non-implemented methods:
  
  - _contains_elem
  - _contains_ideal
  - _quotient
  - _intersect
  - _union
  - _product
  - is_whole_ring
  - is_zero
  - is_prime, is_maximal, is_primary, is_radical
  - is_principal
  - height, depth
  - radical
  
  Methods that likely should be overridden in subclasses:
  
  - reduce_element
class_docstr_tok: ["Abstract","base","class","for","ideals",".","Do","not","instantiate","-","use","explicit","constructors","in","the","ring","class","instead",":",">",">",">","from","sympy","import","QQ",">",">",">","from","sympy.abc","import","x",">",">",">","QQ.old_poly_ring","(","x",")",".ideal","(","x+1",")","<","x","+","1",">","Attributes","-","ring","-","the","ring","this","ideal","belongs","to","Non-implemented","methods",":","-","_contains_elem","-","_contains_ideal","-","_quotient","-","_intersect","-","_union","-","_product","-","is_whole_ring","-","is_zero","-","is_prime",",","is_maximal",",","is_primary",",","is_radical","-","is_principal","-","height",",","depth","-","radical","Methods","that","likely","should","be","overridden","in","subclasses",":","-","reduce_element"]
docstr: Return True if ``self`` is a principal ideal.
docstr_tok: ["Return","True","if","``","self","``","is","a","principal","ideal","."]
code: def is_principal(self):
      """Return True if ``self`` is a principal ideal."""
      raise NotImplementedError
  
imports: from sympy.polys.polyerrors import CoercionFailed
  from sympy.polys.polyutils import IntegerPowerable
label_desc: Use image node_id 12 for calling the Ideal obj's underlying member method code with example usage: obj.is_principal() without return types