def homology(self,varient="complement",*args): hom = {} cc = self.chain_complex(varient,(-1,self.poly_ring.ngens()+1),*args) #Some need wider return range for i in range(self.poly_ring.ngens()+1): vs_am = VectorSpace(QQ,len(cc[i])) if len(cc[i])==0: hom[i] = [] continue if len(cc[i-1])!=0: d_im = [] for b in cc[i-1]: d_b = self.differential(b,varient,*args) d_im.append(lift_to_basis(d_b,cc[i])) img = vs_am.subspace(d_im) else: img = vs_am.subspace([vs_am.zero()]) if len(cc[i+1])!=0: d_ker = [] for b in cc[i]: d_b = self.differential(b,varient,*args) d_ker.append(lift_to_basis(d_b,cc[i+1])) ker = (matrix(QQ,d_ker)).left_kernel() else: ker = vs_am quo = ker.quotient(img) hom[i] = [] for b in quo.basis(): vec = quo.lift(b) part_sum = LogarithmicDifferentialForm.make_zero(i,self) for c,f in zip(vec,cc[i]): part_sum = part_sum + c*f hom[i].append(part_sum) return hom
def test_interior_0_form(self): x = self.x y = self.y z = self.z logdf = LogarithmicDifferentialForm(0,[x*y-y*z+x**2-z**2+x*x-y*z],self.normal_logdf) int_product = logdf.interior_product() zero = LogarithmicDifferentialForm.make_zero(0,self.normal_logdf) self.assertTrue(int_product.equals(zero))
def test_interior_0_form(self): x = self.x y = self.y z = self.z logdf = LogarithmicDifferentialForm( 0, [x * y - y * z + x**2 - z**2 + x * x - y * z], self.normal_logdf) int_product = logdf.interior_product() zero = LogarithmicDifferentialForm.make_zero(0, self.normal_logdf) self.assertTrue(int_product.equals(zero))
def test_zero_p(self): size = [1,3,3,1] for s,i in zip(size,range(4)): zero = LogarithmicDifferentialForm.make_zero(i,self.normal_logdf) zero_vec = [self.normal_logdf.poly_ring.zero() for _ in range(s)] self.assertEqual(zero.vec,zero_vec)
def _weighted_sum(weights,forms,diff_forms): part = LogarithmicDifferentialForm.make_zero(forms[0].degree,diff_forms) for w,f in zip(weights,forms): part = part + w*f return part
def test_zero_p(self): size = [1, 3, 3, 1] for s, i in zip(size, range(4)): zero = LogarithmicDifferentialForm.make_zero(i, self.normal_logdf) zero_vec = [self.normal_logdf.poly_ring.zero() for _ in range(s)] self.assertEqual(zero.vec, zero_vec)