diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,7 @@
+Changes in 0.4.1:
+
+* added indexOf/getIndexOf
+
 Changes in 0.4:
 
 * Amir Livne Bar-on implemented cycle-related functions
diff --git a/lib/Data/Permute.hs b/lib/Data/Permute.hs
--- a/lib/Data/Permute.hs
+++ b/lib/Data/Permute.hs
@@ -22,6 +22,7 @@
     -- * Accessing permutation elements
     at,
     unsafeAt,
+    indexOf,
 
     -- * Permutation properties
     size,
@@ -99,7 +100,12 @@
         error "Invalid index"
 {-# INLINE at #-}
 
--- | Get the inverse of a permutation
+-- | @indexOf p x@ gets an index @i@ such that @at p i@ equals @x@.
+indexOf :: Permute -> Int -> Int
+indexOf p x = runST $ flip getIndexOf x =<< unsafeThaw p
+{-# INLINE indexOf #-}
+
+-- | Get the inverse of a permutation.
 inverse :: Permute -> Permute
 inverse p = runST $ 
     unsafeFreeze =<< getInverse =<< unsafeThaw p
diff --git a/lib/Data/Permute/MPermute.hs b/lib/Data/Permute/MPermute.hs
--- a/lib/Data/Permute/MPermute.hs
+++ b/lib/Data/Permute/MPermute.hs
@@ -1,4 +1,4 @@
-{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, 
+{-# LANGUAGE BangPatterns, MultiParamTypeClasses, FunctionalDependencies, 
         FlexibleContexts #-}
 -----------------------------------------------------------------------------
 -- |
@@ -29,6 +29,7 @@
     -- * Accessing permutation elements
     getElem,
     setElem,
+    getIndexOf,
     swapElems,
     
     -- * Permutation properties
@@ -212,6 +213,17 @@
     when (i < 0 || i >= n) $ fail "getElem: invalid index"
     unsafeGetElem p i
 {-# INLINE getElem #-}
+
+-- | @getIndexOf p x@ returns @i@ sutch that @getElem p i@ equals @x@.  This
+-- is a linear-time operation.
+getIndexOf :: (MPermute p m) => p -> Int -> m Int
+getIndexOf p x = 
+    let go !i (y:ys) | y == x    = i
+                     | otherwise = go (i+1) ys
+        go _ _ = error "getIndexOf: invalid element"
+    in 
+        liftM (go 0) $ getElems p
+{-# INLINE getIndexOf #-}
 
 -- | @setElem p i x@ sets the value of the @i@th element of the permutation
 -- @p@.  The index @i@ must be in the range @0..(n-1)@, where @n@ is the
diff --git a/permutation.cabal b/permutation.cabal
--- a/permutation.cabal
+++ b/permutation.cabal
@@ -1,5 +1,5 @@
 name:            permutation
-version:         0.4
+version:         0.4.1
 homepage:        http://stat.stanford.edu/~patperry/code/permutation
 synopsis:        A library for permutations and combinations.
 description:
@@ -57,8 +57,13 @@
                      Data.Permute.IOBase
 
     build-depends:   base
-    extensions:      MultiParamTypeClasses, FunctionalDependencies, 
-                     FlexibleContexts, Rank2Types, MagicHash, UnboxedTuples
+    extensions:      BangPatterns, 
+                     FlexibleContexts,
+                     FunctionalDependencies, 
+                     MagicHash,
+                     MultiParamTypeClasses, 
+                     Rank2Types,
+                     UnboxedTuples
 
     ghc-options:     -Wall
 
diff --git a/tests/Permute.hs b/tests/Permute.hs
--- a/tests/Permute.hs
+++ b/tests/Permute.hs
@@ -55,6 +55,10 @@
     forAll arbitrary $ \(Index n i) ->
     forAll (Test.permute n) $ \p ->
         a p i == (elems p) !! i
+prop_indexOf =
+    forAll arbitrary $ \(Index n x) ->
+    forAll (Test.permute n) $ \p ->
+        at p (indexOf p x) == x
 
 prop_size_inverse (p :: Permute) =
     size (inverse p) == size p
@@ -175,6 +179,7 @@
     , ("elems . cyclesPermute"      , mytest prop_elems_cyclesPermute)
     , ("at"                         , mytest prop_at)
     , ("unsafeAt"                   , mytest prop_unsafeAt)
+    , ("indexOf"                    , mytest prop_indexOf)
     , ("size . inverse"             , mytest prop_size_inverse)
     , ("elems . inverse"            , mytest prop_elems_inverse)
     , ("swaps"                      , mytest prop_swaps)
