         working = result
         result = [:]
         result.reserveCapacity(working.count)
+    }
+    
+    static func identity(size n: Int) -> RowEliminationWorker<R> {
+        let comps = (0 ..< n).map { i in (i, i, R.identity) }
+        return RowEliminationWorker(size: (n, n), components: comps)
     }
 
     // for test

            }
        }
        
        working[i2] = toHead.drop{ c in c.value == .zero } // possibly nil
    }
    
    func finished(row i: Int) {

            fatalError("attempt to add from empty row: \(i1)")
        }
        
        guard var toHead = working[i2] else {
            fatalError("attempt to add into empty row: \(i2)")
        }
        
        if fromHead.value.index < toHead.value.index {
            // from: ●-->○-->○----->○-------->
            //   to:            ●------->○--->
            
            toHead = LinkedList((fromHead.value.index, .zero), next: toHead)

            // from: ●-->○-->○----->○-------->
            //   to: ●--------->○------->○--->
        }
        
        var (from, to) = (fromHead, toHead)
        
        while true {
            // At this point, it is assured that
            // `from.value.index >= to.value.index`
            
            // from: ------------->●--->○-------->
            //   to: -->●----->○------------>○--->
            
