+-- >>> let m = fromList [[2,3],[5,7]] :: Mat2 Double
+-- >>> let rot = givens_rotator 0 1 2.0 5.0 :: Mat2 Double
+-- >>> ((transpose rot) * m) !!! (1,0) < 1e-12
+-- True
+-- >>> let (Mat rows) = rot
+-- >>> let (Mat cols) = transpose rot
+-- >>> V.map norm rows :: Vec2 Double
+-- fromList [1.0,1.0]
+-- >>> V.map norm cols :: Vec2 Double
+-- fromList [1.0,1.0]
+--
+-- >>> let m = fromList [[12,-51,4],[6,167,-68],[-4,24,-41]] :: Mat3 Double
+-- >>> let rot = givens_rotator 1 2 6 (-4) :: Mat3 Double
+-- >>> let ex_rot_r1 = [1,0,0] :: [Double]
+-- >>> let ex_rot_r2 = [0,0.83205,-0.55470] :: [Double]
+-- >>> let ex_rot_r3 = [0, 0.55470, 0.83205] :: [Double]
+-- >>> let ex_rot = fromList [ex_rot_r1, ex_rot_r2, ex_rot_r3] :: Mat3 Double
+-- >>> frobenius_norm ((transpose rot) - ex_rot) < 1e-4
+-- True
+-- >>> ((transpose rot) * m) !!! (2,0) == 0
+-- True
+-- >>> let (Mat rows) = rot
+-- >>> let (Mat cols) = transpose rot
+-- >>> V.map norm rows :: Vec3 Double
+-- fromList [1.0,1.0,1.0]
+-- >>> V.map norm cols :: Vec3 Double
+-- fromList [1.0,1.0,1.0]
+--
+givens_rotator :: forall m a. (Eq a, Ring.C a, Algebraic.C a, Arity m)