         typealias Summand = ModuleObject<A, Q>.Summand
         
         let n = t.intValue
-        let indices = (0 ..< self.summands.count).filter{ i in self[i].divisor == n }
-        let sub = subSummands(indices: indices)
+        let sub = subSummands{ s in s.divisor == n }
         
         let summands = sub.summands.map { s -> Summand in
             Summand(s.generator.mapValues{ Q($0) }, .zero)

    }
    
    public var freePart: ModuleObject<A, R> {
        let indices = (0 ..< summands.count).filter{ i in self[i].isFree }
        return subSummands(indices: indices)
    }
    
    public var torsionPart: ModuleObject<A, R> {
        let indices = (0 ..< summands.count).filter{ i in !self[i].isFree }
        return subSummands(indices: indices)
    }
    
    public func subSummands(_ indices: Int ...) -> ModuleObject<A, R> {

        let sub = indices.map{ summands[$0] }
        let T = transform.submatrix(rowsMatching: { i in indices.contains(i)}, colsMatching: { _ in true })
        return ModuleObject(sub, basis, T)
    }
    
    public func subSummands(matching: (Summand) -> Bool) -> ModuleObject<A, R> {
        let indices = (0 ..< summands.count).filter{ i in matching(self[i]) }
        return subSummands(indices: indices)
    }
    
    public static func ⊕(M1: ModuleObject<A, R>, M2: ModuleObject<A, R>) -> ModuleObject<A, R> {
