class_docstr: Concrete class for homomorphisms with domain a free module or a quotient
  thereof.
  
  Do not instantiate; the constructor does not check that your data is well
  defined. Use the ``homomorphism`` function instead:
  
  >>> from sympy import QQ
  >>> from sympy.abc import x
  >>> from sympy.polys.agca import homomorphism
  
  >>> F = QQ.old_poly_ring(x).free_module(2)
  >>> homomorphism(F, F, [[1, 0], [0, 1]])
  Matrix([
  [1, 0], : QQ[x]**2 -> QQ[x]**2
  [0, 1]])
class_docstr_tok: ["Concrete","class","for","homomorphisms","with","domain","a","free","module","or","a","quotient","thereof",".","Do","not","instantiate",";","the","constructor","does","not","check","that","your","data","is","well","defined",".","Use","the","``","homomorphism","``","function","instead",":",">",">",">","from","sympy","import","QQ",">",">",">","from","sympy.abc","import","x",">",">",">","from","sympy.polys.agca","import","homomorphism",">",">",">","F","=","QQ.old_poly_ring","(","x",")",".free_module","(","2",")",">",">",">","homomorphism","(","F",",","F",",","[","[","1",",","0","]",",","[","0",",","1","]","]",")","Matrix","(","[","[","1",",","0","]",",",":","QQ","[","x","]","*","*","2","-",">","QQ","[","x","]","*","*","2","[","0",",","1","]","]",")"]
code: def _kernel(self):
      # The domain is either a free module or a quotient thereof.
      # It does not matter if it is a quotient, because that won't increase
      # the kernel.
      # Our generators {e_i} are sent to the matrix entries {b_i}.
      # The kernel is essentially the syzygy module of these {b_i}.
      syz = self.image().syzygy_module()
      return self.domain.submodule(*syz.gens)
  
imports: from sympy.polys.agca.modules import Module, FreeModule, QuotientModule, SubModule, SubQuotientModule
  from sympy.polys.polyerrors import CoercionFailed
label_desc: Use image node_id 3 for calling the FreeModuleHomomorphism obj's underlying member method code with example usage: obj._kernel() and returns: self