diff --git a/linear-circuit.cabal b/linear-circuit.cabal
--- a/linear-circuit.cabal
+++ b/linear-circuit.cabal
@@ -1,5 +1,5 @@
 Name:                linear-circuit
-Version:             0.1.0.1
+Version:             0.1.0.2
 Synopsis:            Compute resistance of linear electrical circuits
 Description:
   Compute resistance of linear electrical circuits.
@@ -15,7 +15,7 @@
 Cabal-Version:       >=1.10
 
 Source-Repository this
-  Tag:         0.1.0.1
+  Tag:         0.1.0.2
   Type:        darcs
   Location:    http://hub.darcs.net/thielema/linear-circuit
 
@@ -27,7 +27,7 @@
   Exposed-Modules:
     Math.LinearCircuit
   Build-Depends:
-    lapack >=0.3 && <0.4,
+    lapack >=0.3.1 && <0.4,
     netlib-ffi >=0.1.1 && <0.2,
     comfort-array >=0.4 && <0.5,
     comfort-graph >=0.0 && <0.1,
diff --git a/src/Math/LinearCircuit.hs b/src/Math/LinearCircuit.hs
--- a/src/Math/LinearCircuit.hs
+++ b/src/Math/LinearCircuit.hs
@@ -5,11 +5,11 @@
 import Data.Graph.Comfort (Graph)
 
 import qualified Numeric.LAPACK.Matrix.Shape as MatrixShape
-import qualified Numeric.LAPACK.Matrix.Triangular as Triangular
+import qualified Numeric.LAPACK.Matrix.Symmetric as Symmetric
 import qualified Numeric.LAPACK.Matrix as Matrix
 import qualified Numeric.LAPACK.Vector as Vector
 import qualified Numeric.Netlib.Class as Class
-import Numeric.LAPACK.Matrix.Triangular ((#%%%#))
+import Numeric.LAPACK.Matrix.Symmetric ((#%%%#))
 import Numeric.LAPACK.Matrix ((#\|))
 
 import qualified Data.Array.Comfort.Boxed as BoxedArray
@@ -40,7 +40,7 @@
 fullMatrix ::
    (Graph.Edge edge, Ord node, Class.Floating a) =>
    Graph edge node a nodeLabel -> node ->
-   Triangular.Symmetric (():+:(Set (Wrap edge node):+:Set node)) a
+   Matrix.Symmetric (():+:(Set (Wrap edge node):+:Set node)) a
 fullMatrix gr src =
    let edges = Map.mapKeysMonotonic IdentityT $ Graph.edgeLabels gr
        nodes = Graph.nodeSet gr
@@ -49,15 +49,35 @@
        unit = Vector.unit (Map.keysSet edges :+: nodes) (Right src)
    in (symmetricZero (), Matrix.singleRow order unit)
       #%%%#
-      (Triangular.diagonal order $ Array.fromMap edges,
+      (Symmetric.diagonal order $ Array.fromMap edges,
             voltageMatrix nodes $ Map.keysSet edges)
       #%%%#
       symmetricZero nodes
 
-resistance ::
+_resistance ::
    (Graph.Edge edge, Ord node, Class.Floating a) =>
    Graph edge node a nodeLabel -> node -> node -> a
-resistance gr src dst =
+_resistance gr src dst =
    let m = fullMatrix gr src
        ix = Right (Right dst)
-   in - (m #\| Vector.unit (Triangular.size m) ix) ! ix
+   in - (m #\| Vector.unit (Symmetric.size m) ix) ! ix
+
+{-
+The above computation with blockwise inversion.
+-}
+resistance ::
+   (Graph.Edge edge, Ord node, Class.Floating a) =>
+   Graph edge node a nodeLabel -> node -> node -> a
+resistance gr src dst =
+   let edges = Map.mapKeysMonotonic IdentityT $ Graph.edgeLabels gr
+       nodes = Graph.nodeSet gr
+       order = MatrixShape.RowMajor
+       schurComplement =
+         (Matrix.zero $ MatrixShape.symmetric order (),
+            Matrix.singleRow order $ Vector.negate $ Vector.unit nodes src)
+         #%%%#
+         Symmetric.congruenceDiagonal
+            (Vector.recip $ Array.fromMap edges)
+            (voltageMatrix nodes $ Map.keysSet edges)
+       ix = Right dst
+   in (schurComplement #\| Vector.unit (() :+: nodes) ix) ! ix
