{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE UnboxedSums #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE UnliftedNewtypes #-}

-- |
-- Module: Numeric.Montgomery.Secp256k1.Scalar
-- Copyright: (c) 2025 Jared Tobin
-- License: MIT
-- Maintainer: Jared Tobin <jared@ppad.tech>
--
-- Montgomery form 'Wider' words, as well as arithmetic operations, with
-- domain derived from the secp256k1 elliptic curve scalar group order.

module Numeric.Montgomery.Secp256k1.Scalar (
  -- * Montgomery form, secp256k1 scalar group order modulus
    Montgomery(..)
  , render
  , to
  , from
  , zero
  , one

  -- * Comparison
  , eq
  , eq_vartime

  -- * Reduction and retrieval
  , redc
  , retr
  , redc#
  , retr#

  -- * Constant-time selection
  , select#
  , select

  -- * Montgomery arithmetic
  , add
  , add#
  , sub
  , sub#
  , mul
  , mul#
  , sqr
  , sqr#
  , neg
  , neg#
  , inv
  , inv#
  , exp
  , odd#
  , odd
  ) where

import Control.DeepSeq
import qualified Data.Choice as C
import Data.Word.Limb (Limb(..))
import qualified Data.Word.Limb as L
import qualified Data.Word.Wide as W
import Data.Word.Wider (Wider(..))
import qualified Data.Word.Wider as WW
import GHC.Exts (Word(..))
import Prelude hiding (or, and, not, exp, odd)

-- montgomery arithmetic, specialized to the secp256k1 scalar group order
-- 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

-- | Montgomery-form 'Wider' words, on the Montgomery domain defined by
--   the secp256k1 scalar group order.
--
--   >>> let one = 1 :: Montgomery
--   >>> one
--   1
--   >>> putStrLn (render one)
--   (4624529908474429119, 4994812053365940164, 1, 0)
data Montgomery = Montgomery !(# Limb, Limb, Limb, Limb #)

instance Show Montgomery where
  show :: Montgomery -> String
show = Wider -> String
forall a. Show a => a -> String
show (Wider -> String) -> (Montgomery -> Wider) -> Montgomery -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Montgomery -> Wider
from

-- | Render a 'Montgomery' value as a 'String', showing its individual
--   'Limb's.
--
--   >>> putStrLn (render 1)
--   (4624529908474429119, 4994812053365940164, 1, 0)
render :: Montgomery -> String
render :: Montgomery -> String
render (Montgomery (# Limb Word#
a, Limb Word#
b, Limb Word#
c, Limb Word#
d #)) =
     String
"(" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Word -> String
forall a. Show a => a -> String
show (Word# -> Word
W# Word#
a) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
", " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Word -> String
forall a. Show a => a -> String
show (Word# -> Word
W# Word#
b) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
", "
  String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Word -> String
forall a. Show a => a -> String
show (Word# -> Word
W# Word#
c) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
", " String -> ShowS
forall a. Semigroup a => a -> a -> a
<> Word -> String
forall a. Show a => a -> String
show (Word# -> Word
W# Word#
d) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
")"

instance Num Montgomery where
  Montgomery
a + :: Montgomery -> Montgomery -> Montgomery
+ Montgomery
b = Montgomery -> Montgomery -> Montgomery
add Montgomery
a Montgomery
b
  Montgomery
a - :: Montgomery -> Montgomery -> Montgomery
- Montgomery
b = Montgomery -> Montgomery -> Montgomery
sub Montgomery
a Montgomery
b
  Montgomery
a * :: Montgomery -> Montgomery -> Montgomery
* Montgomery
b = Montgomery -> Montgomery -> Montgomery
mul Montgomery
a Montgomery
b
  negate :: Montgomery -> Montgomery
negate Montgomery
a = Montgomery -> Montgomery
neg Montgomery
a
  abs :: Montgomery -> Montgomery
abs = Montgomery -> Montgomery
forall a. a -> a
id
  fromInteger :: Integer -> Montgomery
fromInteger = Wider -> Montgomery
to (Wider -> Montgomery)
-> (Integer -> Wider) -> Integer -> Montgomery
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Wider
WW.to
  signum :: Montgomery -> Montgomery
signum Montgomery
a = case Montgomery
a of
    Montgomery (# Limb Word#
0##, Limb Word#
0##, Limb Word#
0##, Limb Word#
0## #) -> Montgomery
0
    Montgomery
_ -> Montgomery
1

instance Eq Montgomery where
  Montgomery
a == :: Montgomery -> Montgomery -> Bool
== Montgomery
b = Choice -> Bool
C.decide (Montgomery -> Montgomery -> Choice
eq Montgomery
a Montgomery
b)

instance NFData Montgomery where
  rnf :: Montgomery -> ()
rnf (Montgomery (# Limb, Limb, Limb, Limb #)
a) = case (# Limb, Limb, Limb, Limb #)
a of (# Limb
_, Limb
_, Limb
_, Limb
_ #) -> ()

-- utilities ------------------------------------------------------------------

-- Wide wrapping addition, when addend is only a limb.
wadd_w# :: (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# :: (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (# Limb
x_lo, Limb
x_hi #) Limb
y_lo =
  let !(# Limb
s0, Limb
c0 #) = Limb -> Limb -> (# Limb, Limb #)
L.add_o# Limb
x_lo Limb
y_lo
      !(# Limb
s1, Limb
_ #) = Limb -> Limb -> (# Limb, Limb #)
L.add_o# Limb
x_hi Limb
c0
  in  (# Limb
s0, Limb
s1 #)
{-# INLINE wadd_w# #-}

-- Truncate a wide word to a 'Limb'.
lo :: (# Limb, Limb #) -> Limb
lo :: (# Limb, Limb #) -> Limb
lo (# Limb
l, Limb
_ #) = Limb
l
{-# INLINE lo #-}

-- comparison -----------------------------------------------------------------

-- | Constant-time equality comparison.
eq :: Montgomery -> Montgomery -> C.Choice
eq :: Montgomery -> Montgomery -> Choice
eq
  (Montgomery (# Limb Word#
a0, Limb Word#
a1, Limb Word#
a2, Limb Word#
a3 #))
  (Montgomery (# Limb Word#
b0, Limb Word#
b1, Limb Word#
b2, Limb Word#
b3 #))
  = (# Word#, Word#, Word#, Word# #)
-> (# Word#, Word#, Word#, Word# #) -> Choice
C.eq_wider# (# Word#
a0, Word#
a1, Word#
a2, Word#
a3 #) (# Word#
b0, Word#
b1, Word#
b2, Word#
b3 #)
{-# INLINE eq #-}

-- | Variable-time equality comparison.
eq_vartime :: Montgomery -> Montgomery -> Bool
eq_vartime :: Montgomery -> Montgomery -> Bool
eq_vartime (Montgomery ((# Limb, Limb, Limb, Limb #) -> Wider
Wider -> Wider
a)) (Montgomery ((# Limb, Limb, Limb, Limb #) -> Wider
Wider -> Wider
b)) =
  Wider -> Wider -> Bool
WW.eq_vartime Wider
a Wider
b

-- innards --------------------------------------------------------------------

redc_inner#
  :: (# Limb, Limb, Limb, Limb #)              -- ^ upper limbs
  -> (# Limb, Limb, Limb, Limb #)              -- ^ lower limbs
  -> (# (# Limb, Limb, Limb, Limb #), Limb #) -- ^ upper limbs, meta-carry
redc_inner# :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# (# Limb, Limb, Limb, Limb #), Limb #)
redc_inner# (# Limb
u0, Limb
u1, Limb
u2, Limb
u3 #) (# Limb
l0, Limb
l1, Limb
l2, Limb
l3 #) =
  let !(# Limb
m0, Limb
m1, Limb
m2, Limb
m3 #) =
        (# Word# -> Limb
Limb Word#
0xBFD25E8CD0364141##, Word# -> Limb
Limb Word#
0xBAAEDCE6AF48A03B##
        ,  Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFE##, Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFF## #)
      !n :: Limb
n                = Word# -> Limb
Limb Word#
0x4B0DFF665588B13F##
      !w_0 :: Limb
w_0              = Limb -> Limb -> Limb
L.mul_w# Limb
l0 Limb
n
      !(# Limb
_, Limb
c_00 #)    = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_0 Limb
m0 Limb
l0 (Word# -> Limb
Limb Word#
0##)
      !(# Limb
l0_1, Limb
c_01 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_0 Limb
m1 Limb
l1 Limb
c_00
      !(# Limb
l0_2, Limb
c_02 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_0 Limb
m2 Limb
l2 Limb
c_01
      !(# Limb
l0_3, Limb
c_03 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_0 Limb
m3 Limb
l3 Limb
c_02
      !(# Limb
u_0, Limb
mc_0 #)  = Limb -> Limb -> Limb -> (# Limb, Limb #)
L.add_c# Limb
u0 Limb
c_03 (Word# -> Limb
Limb Word#
0##)
      !w_1 :: Limb
w_1              = Limb -> Limb -> Limb
L.mul_w# Limb
l0_1 Limb
n
      !(# Limb
_, Limb
c_10 #)    = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_1 Limb
m0 Limb
l0_1 (Word# -> Limb
Limb Word#
0##)
      !(# Limb
l1_1, Limb
c_11 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_1 Limb
m1 Limb
l0_2 Limb
c_10
      !(# Limb
l1_2, Limb
c_12 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_1 Limb
m2 Limb
l0_3 Limb
c_11
      !(# Limb
u1_3, Limb
c_13 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_1 Limb
m3 Limb
u_0 Limb
c_12
      !(# Limb
u_1, Limb
mc_1 #)  = Limb -> Limb -> Limb -> (# Limb, Limb #)
L.add_c# Limb
u1 Limb
c_13 Limb
mc_0
      !w_2 :: Limb
w_2              = Limb -> Limb -> Limb
L.mul_w# Limb
l1_1 Limb
n
      !(# Limb
_, Limb
c_20 #)    = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_2 Limb
m0 Limb
l1_1 (Word# -> Limb
Limb Word#
0##)
      !(# Limb
l2_1, Limb
c_21 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_2 Limb
m1 Limb
l1_2 Limb
c_20
      !(# Limb
u2_2, Limb
c_22 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_2 Limb
m2 Limb
u1_3 Limb
c_21
      !(# Limb
u2_3, Limb
c_23 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_2 Limb
m3 Limb
u_1 Limb
c_22
      !(# Limb
u_2, Limb
mc_2 #)  = Limb -> Limb -> Limb -> (# Limb, Limb #)
L.add_c# Limb
u2 Limb
c_23 Limb
mc_1
      !w_3 :: Limb
w_3              = Limb -> Limb -> Limb
L.mul_w# Limb
l2_1 Limb
n
      !(# Limb
_, Limb
c_30 #)    = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_3 Limb
m0 Limb
l2_1 (Word# -> Limb
Limb Word#
0##)
      !(# Limb
u3_1, Limb
c_31 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_3 Limb
m1 Limb
u2_2 Limb
c_30
      !(# Limb
u3_2, Limb
c_32 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_3 Limb
m2 Limb
u2_3 Limb
c_31
      !(# Limb
u3_3, Limb
c_33 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
w_3 Limb
m3 Limb
u_2 Limb
c_32
      !(# Limb
u_3, Limb
mc_3 #)  = Limb -> Limb -> Limb -> (# Limb, Limb #)
L.add_c# Limb
u3 Limb
c_33 Limb
mc_2
  in  (# (# Limb
u3_1, Limb
u3_2, Limb
u3_3, Limb
u_3 #), Limb
mc_3 #)
{-# INLINE redc_inner# #-}

redc#
  :: (# Limb, Limb, Limb, Limb #) -- ^ lower limbs
  -> (# Limb, Limb, Limb, Limb #) -- ^ upper limbs
  -> (# Limb, Limb, Limb, Limb #) -- ^ result
redc# :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
redc# (# Limb, Limb, Limb, Limb #)
l (# Limb, Limb, Limb, Limb #)
u =
  let -- group order
      !m :: (# Limb, Limb, Limb, Limb #)
m = (# Word# -> Limb
Limb Word#
0xBFD25E8CD0364141##, Word# -> Limb
Limb Word#
0xBAAEDCE6AF48A03B##
           ,  Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFE##, Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFF## #)
      !(# (# Limb, Limb, Limb, Limb #)
nu, Limb
mc #) = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# (# Limb, Limb, Limb, Limb #), Limb #)
redc_inner# (# Limb, Limb, Limb, Limb #)
u (# Limb, Limb, Limb, Limb #)
l
  in  (# Limb, Limb, Limb, Limb #)
-> Limb
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
WW.sub_mod_c# (# Limb, Limb, Limb, Limb #)
nu Limb
mc (# Limb, Limb, Limb, Limb #)
m (# Limb, Limb, Limb, Limb #)
m
{-# INLINE redc# #-}

-- | Montgomery reduction.
--
--   The first argument represents the low words, and the second the
--   high words, of an extra-large eight-limb word in Montgomery form.
redc
  :: Montgomery -- ^ low wider-word, Montgomery form
  -> Montgomery -- ^ high wider-word, Montgomery form
  -> Montgomery -- ^ reduced value
redc :: Montgomery -> Montgomery -> Montgomery
redc (Montgomery (# Limb, Limb, Limb, Limb #)
l) (Montgomery (# Limb, Limb, Limb, Limb #)
u) =
  let !res :: (# Limb, Limb, Limb, Limb #)
res = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
redc# (# Limb, Limb, Limb, Limb #)
l (# Limb, Limb, Limb, Limb #)
u
  in  ((# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery (# Limb, Limb, Limb, Limb #)
res)

retr_inner#
  :: (# Limb, Limb, Limb, Limb #) -- ^ value in montgomery form
  -> (# Limb, Limb, Limb, Limb #) -- ^ retrieved value
retr_inner# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
retr_inner# (# Limb
x0, Limb
x1, Limb
x2, Limb
x3 #) =
  let !(# Limb
m0, Limb
m1, Limb
m2, Limb
m3 #) =
        (# Word# -> Limb
Limb Word#
0xBFD25E8CD0364141##, Word# -> Limb
Limb Word#
0xBAAEDCE6AF48A03B##
        ,  Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFE##, Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFF## #)
      !n :: Limb
n                = Word# -> Limb
Limb Word#
0x4B0DFF665588B13F##
      !u_0 :: Limb
u_0              = Limb -> Limb -> Limb
L.mul_w# Limb
x0 Limb
n
      !(# Limb
_, Limb
o0 #)      = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_0 Limb
m0 Limb
x0 (Word# -> Limb
Limb Word#
0##)
      !(# Limb
o0_1, Limb
p0_1 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_0 Limb
m1 (Word# -> Limb
Limb Word#
0##) Limb
o0
      !(# Limb
p0_2, Limb
q0_2 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_0 Limb
m2 (Word# -> Limb
Limb Word#
0##) Limb
p0_1
      !(# Limb
q0_3, Limb
r0_3 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_0 Limb
m3 (Word# -> Limb
Limb Word#
0##) Limb
q0_2
      !u_1 :: Limb
u_1              = Limb -> Limb -> Limb
L.mul_w# (Limb -> Limb -> Limb
L.add_w# Limb
o0_1 Limb
x1) Limb
n
      !(# Limb
_, Limb
o1 #)      = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_1 Limb
m0 Limb
x1 Limb
o0_1
      !(# Limb
o1_1, Limb
p1_1 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_1 Limb
m1 Limb
p0_2 Limb
o1
      !(# Limb
p1_2, Limb
q1_2 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_1 Limb
m2 Limb
q0_3 Limb
p1_1
      !(# Limb
q1_3, Limb
r1_3 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_1 Limb
m3 Limb
r0_3 Limb
q1_2
      !u_2 :: Limb
u_2              = Limb -> Limb -> Limb
L.mul_w# (Limb -> Limb -> Limb
L.add_w# Limb
o1_1 Limb
x2) Limb
n
      !(# Limb
_, Limb
o2 #)      = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_2 Limb
m0 Limb
x2 Limb
o1_1
      !(# Limb
o2_1, Limb
p2_1 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_2 Limb
m1 Limb
p1_2 Limb
o2
      !(# Limb
p2_2, Limb
q2_2 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_2 Limb
m2 Limb
q1_3 Limb
p2_1
      !(# Limb
q2_3, Limb
r2_3 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_2 Limb
m3 Limb
r1_3 Limb
q2_2
      !u_3 :: Limb
u_3              = Limb -> Limb -> Limb
L.mul_w# (Limb -> Limb -> Limb
L.add_w# Limb
o2_1 Limb
x3) Limb
n
      !(# Limb
_, Limb
o3 #)      = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_3 Limb
m0 Limb
x3 Limb
o2_1
      !(# Limb
o3_1, Limb
p3_1 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_3 Limb
m1 Limb
p2_2 Limb
o3
      !(# Limb
p3_2, Limb
q3_2 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_3 Limb
m2 Limb
q2_3 Limb
p3_1
      !(# Limb
q3_3, Limb
r3_3 #) = Limb -> Limb -> Limb -> Limb -> (# Limb, Limb #)
L.mac# Limb
u_3 Limb
m3 Limb
r2_3 Limb
q3_2
  in  (# Limb
o3_1, Limb
p3_2, Limb
q3_3, Limb
r3_3 #)
{-# INLINE retr_inner# #-}

retr#
  :: (# Limb, Limb, Limb, Limb #)
  -> (# Limb, Limb, Limb, Limb #)
retr# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
retr# (# Limb, Limb, Limb, Limb #)
f = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
retr_inner# (# Limb, Limb, Limb, Limb #)
f
{-# INLINE retr# #-}

-- | Retrieve a 'Montgomery' value from the Montgomery domain, producing
--   a 'Wider' word.
retr
  :: Montgomery -- ^ value in Montgomery form
  -> Wider      -- ^ retrieved value
retr :: Montgomery -> Wider
retr (Montgomery (# Limb, Limb, Limb, Limb #)
f) =
  let !res :: (# Limb, Limb, Limb, Limb #)
res = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
retr# (# Limb, Limb, Limb, Limb #)
f
  in  ((# Limb, Limb, Limb, Limb #) -> Wider
Wider (# Limb, Limb, Limb, Limb #)
res)

-- | Montgomery multiplication (FIOS), without conditional subtract.
mul_inner#
  :: (# Limb, Limb, Limb, Limb #)              -- ^ x
  -> (# Limb, Limb, Limb, Limb #)              -- ^ y
  -> (# (# Limb, Limb, Limb, Limb #), Limb #)  -- ^ product, meta-carry
mul_inner# :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# (# Limb, Limb, Limb, Limb #), Limb #)
mul_inner# (# Limb
x0, Limb
x1, Limb
x2, Limb
x3 #) (# Limb
y0, Limb
y1, Limb
y2, Limb
y3 #) =
  let !(# Limb
m0, Limb
m1, Limb
m2, Limb
m3 #) =
        (# Word# -> Limb
Limb Word#
0xBFD25E8CD0364141##, Word# -> Limb
Limb Word#
0xBAAEDCE6AF48A03B##
        ,  Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFE##, Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFF## #)
      !n :: Limb
n                           = Word# -> Limb
Limb Word#
0x4B0DFF665588B13F##
      !axy0 :: (# Limb, Limb #)
axy0                        = Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x0 Limb
y0
      !u0 :: Limb
u0                          = Limb -> Limb -> Limb
L.mul_w# ((# Limb, Limb #) -> Limb
lo (# Limb, Limb #)
axy0) Limb
n
      !(# (# Limb
_, Limb
a0 #), Limb
c0 #)       = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u0 Limb
m0) (# Limb, Limb #)
axy0
      !carry0 :: (# Limb, Limb #)
carry0                      = (# Limb
a0, Limb
c0 #)
      !axy0_1 :: (# Limb, Limb #)
axy0_1                      = Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x0 Limb
y1
      !umc0_1 :: (# Limb, Limb #)
umc0_1                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u0 Limb
m1) (# Limb, Limb #)
carry0
      !(# (# Limb
o0, Limb
ab0_1 #), Limb
c0_1 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy0_1 (# Limb, Limb #)
umc0_1
      !carry0_1 :: (# Limb, Limb #)
carry0_1                    = (# Limb
ab0_1, Limb
c0_1 #)
      !axy0_2 :: (# Limb, Limb #)
axy0_2                      = Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x0 Limb
y2
      !umc0_2 :: (# Limb, Limb #)
umc0_2                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u0 Limb
m2) (# Limb, Limb #)
carry0_1
      !(# (# Limb
p0, Limb
ab0_2 #), Limb
c0_2 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy0_2 (# Limb, Limb #)
umc0_2
      !carry0_2 :: (# Limb, Limb #)
carry0_2                    = (# Limb
ab0_2, Limb
c0_2 #)
      !axy0_3 :: (# Limb, Limb #)
axy0_3                      = Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x0 Limb
y3
      !umc0_3 :: (# Limb, Limb #)
umc0_3                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u0 Limb
m3) (# Limb, Limb #)
carry0_2
      !(# (# Limb
q0, Limb
ab0_3 #), Limb
c0_3 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy0_3 (# Limb, Limb #)
umc0_3
      !carry0_3 :: (# Limb, Limb #)
carry0_3                    = (# Limb
ab0_3, Limb
c0_3 #)
      !(# Limb
r0, Limb
mc0 #)               = (# Limb, Limb #)
carry0_3
      !axy1 :: (# Limb, Limb #)
axy1                        = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x1 Limb
y0) Limb
o0
      !u1 :: Limb
u1                          = Limb -> Limb -> Limb
L.mul_w# ((# Limb, Limb #) -> Limb
lo (# Limb, Limb #)
axy1) Limb
n
      !(# (# Limb
_, Limb
a1 #), Limb
c1 #)       = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u1 Limb
m0) (# Limb, Limb #)
axy1
      !carry1 :: (# Limb, Limb #)
carry1                      = (# Limb
a1, Limb
c1 #)
      !axy1_1 :: (# Limb, Limb #)
axy1_1                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x1 Limb
y1) Limb
p0
      !umc1_1 :: (# Limb, Limb #)
umc1_1                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u1 Limb
m1) (# Limb, Limb #)
carry1
      !(# (# Limb
o1, Limb
ab1_1 #), Limb
c1_1 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy1_1 (# Limb, Limb #)
umc1_1
      !carry1_1 :: (# Limb, Limb #)
carry1_1                    = (# Limb
ab1_1, Limb
c1_1 #)
      !axy1_2 :: (# Limb, Limb #)
axy1_2                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x1 Limb
y2) Limb
q0
      !umc1_2 :: (# Limb, Limb #)
umc1_2                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u1 Limb
m2) (# Limb, Limb #)
carry1_1
      !(# (# Limb
p1, Limb
ab1_2 #), Limb
c1_2 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy1_2 (# Limb, Limb #)
umc1_2
      !carry1_2 :: (# Limb, Limb #)
carry1_2                    = (# Limb
ab1_2, Limb
c1_2 #)
      !axy1_3 :: (# Limb, Limb #)
axy1_3                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x1 Limb
y3) Limb
r0
      !umc1_3 :: (# Limb, Limb #)
umc1_3                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u1 Limb
m3) (# Limb, Limb #)
carry1_2
      !(# (# Limb
q1, Limb
ab1_3 #), Limb
c1_3 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy1_3 (# Limb, Limb #)
umc1_3
      !carry1_3 :: (# Limb, Limb #)
carry1_3                    = (# Limb
ab1_3, Limb
c1_3 #)
      !(# Limb
r1, Limb
mc1 #)               = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (# Limb, Limb #)
carry1_3 Limb
mc0
      !axy2 :: (# Limb, Limb #)
axy2                        = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x2 Limb
y0) Limb
o1
      !u2 :: Limb
u2                          = Limb -> Limb -> Limb
L.mul_w# ((# Limb, Limb #) -> Limb
lo (# Limb, Limb #)
axy2) Limb
n
      !(# (# Limb
_, Limb
a2 #), Limb
c2 #)       = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u2 Limb
m0) (# Limb, Limb #)
axy2
      !carry2 :: (# Limb, Limb #)
carry2                      = (# Limb
a2, Limb
c2 #)
      !axy2_1 :: (# Limb, Limb #)
axy2_1                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x2 Limb
y1) Limb
p1
      !umc2_1 :: (# Limb, Limb #)
umc2_1                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u2 Limb
m1) (# Limb, Limb #)
carry2
      !(# (# Limb
o2, Limb
ab2_1 #), Limb
c2_1 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy2_1 (# Limb, Limb #)
umc2_1
      !carry2_1 :: (# Limb, Limb #)
carry2_1                    = (# Limb
ab2_1, Limb
c2_1 #)
      !axy2_2 :: (# Limb, Limb #)
axy2_2                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x2 Limb
y2) Limb
q1
      !umc2_2 :: (# Limb, Limb #)
umc2_2                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u2 Limb
m2) (# Limb, Limb #)
carry2_1
      !(# (# Limb
p2, Limb
ab2_2 #), Limb
c2_2 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy2_2 (# Limb, Limb #)
umc2_2
      !carry2_2 :: (# Limb, Limb #)
carry2_2                    = (# Limb
ab2_2, Limb
c2_2 #)
      !axy2_3 :: (# Limb, Limb #)
axy2_3                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x2 Limb
y3) Limb
r1
      !umc2_3 :: (# Limb, Limb #)
umc2_3                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u2 Limb
m3) (# Limb, Limb #)
carry2_2
      !(# (# Limb
q2, Limb
ab2_3 #), Limb
c2_3 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy2_3 (# Limb, Limb #)
umc2_3
      !carry2_3 :: (# Limb, Limb #)
carry2_3                    = (# Limb
ab2_3, Limb
c2_3 #)
      !(# Limb
r2, Limb
mc2 #)               = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (# Limb, Limb #)
carry2_3 Limb
mc1
      !axy3 :: (# Limb, Limb #)
axy3                        = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x3 Limb
y0) Limb
o2
      !u3 :: Limb
u3                          = Limb -> Limb -> Limb
L.mul_w# ((# Limb, Limb #) -> Limb
lo (# Limb, Limb #)
axy3) Limb
n
      !(# (# Limb
_, Limb
a3 #), Limb
c3 #)       = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u3 Limb
m0) (# Limb, Limb #)
axy3
      !carry3 :: (# Limb, Limb #)
carry3                      = (# Limb
a3, Limb
c3 #)
      !axy3_1 :: (# Limb, Limb #)
axy3_1                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x3 Limb
y1) Limb
p2
      !umc3_1 :: (# Limb, Limb #)
umc3_1                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u3 Limb
m1) (# Limb, Limb #)
carry3
      !(# (# Limb
o3, Limb
ab3_1 #), Limb
c3_1 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy3_1 (# Limb, Limb #)
umc3_1
      !carry3_1 :: (# Limb, Limb #)
carry3_1                    = (# Limb
ab3_1, Limb
c3_1 #)
      !axy3_2 :: (# Limb, Limb #)
axy3_2                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x3 Limb
y2) Limb
q2
      !umc3_2 :: (# Limb, Limb #)
umc3_2                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u3 Limb
m2) (# Limb, Limb #)
carry3_1
      !(# (# Limb
p3, Limb
ab3_2 #), Limb
c3_2 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy3_2 (# Limb, Limb #)
umc3_2
      !carry3_2 :: (# Limb, Limb #)
carry3_2                    = (# Limb
ab3_2, Limb
c3_2 #)
      !axy3_3 :: (# Limb, Limb #)
axy3_3                      = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
x3 Limb
y3) Limb
r2
      !umc3_3 :: (# Limb, Limb #)
umc3_3                      = (# Limb, Limb #) -> (# Limb, Limb #) -> (# Limb, Limb #)
W.add_w# (Limb -> Limb -> (# Limb, Limb #)
L.mul_c# Limb
u3 Limb
m3) (# Limb, Limb #)
carry3_2
      !(# (# Limb
q3, Limb
ab3_3 #), Limb
c3_3 #) = (# Limb, Limb #)
-> (# Limb, Limb #) -> (# (# Limb, Limb #), Limb #)
W.add_o# (# Limb, Limb #)
axy3_3 (# Limb, Limb #)
umc3_3
      !carry3_3 :: (# Limb, Limb #)
carry3_3                    = (# Limb
ab3_3, Limb
c3_3 #)
      !(# Limb
r3, Limb
mc3 #)               = (# Limb, Limb #) -> Limb -> (# Limb, Limb #)
wadd_w# (# Limb, Limb #)
carry3_3 Limb
mc2
  in  (# (# Limb
o3, Limb
p3, Limb
q3, Limb
r3 #), Limb
mc3 #)
{-# INLINE mul_inner# #-}

mul#
  :: (# Limb, Limb, Limb, Limb #)
  -> (# Limb, Limb, Limb, Limb #)
  -> (# Limb, Limb, Limb, Limb #)
mul# :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b =
  let -- group order
      !m :: (# Limb, Limb, Limb, Limb #)
m = (# Word# -> Limb
Limb Word#
0xBFD25E8CD0364141##, Word# -> Limb
Limb Word#
0xBAAEDCE6AF48A03B##
           ,  Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFE##, Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFF## #)
      !(# (# Limb, Limb, Limb, Limb #)
nu, Limb
mc #) = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# (# Limb, Limb, Limb, Limb #), Limb #)
mul_inner# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b
  in  (# Limb, Limb, Limb, Limb #)
-> Limb
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
WW.sub_mod_c# (# Limb, Limb, Limb, Limb #)
nu Limb
mc (# Limb, Limb, Limb, Limb #)
m (# Limb, Limb, Limb, Limb #)
m
{-# NOINLINE mul# #-} -- cannot be inlined without exploding comp time

-- | Multiplication in the Montgomery domain.
--
--   Note that 'Montgomery' is an instance of 'Num', so you can use '*'
--   to apply this function.
--
--   >>> 1 * 1 :: Montgomery
--   1
mul
  :: Montgomery -- ^ multiplicand in montgomery form
  -> Montgomery -- ^ multiplier in montgomery form
  -> Montgomery -- ^ montgomery product
mul :: Montgomery -> Montgomery -> Montgomery
mul (Montgomery (# Limb, Limb, Limb, Limb #)
a) (Montgomery (# Limb, Limb, Limb, Limb #)
b) = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b)

to#
  :: (# Limb, Limb, Limb, Limb #) -- ^ integer
  -> (# Limb, Limb, Limb, Limb #)
to# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
to# (# Limb, Limb, Limb, Limb #)
x =
  let -- r^2 mod m
      !r2 :: (# Limb, Limb, Limb, Limb #)
r2 = (# Word# -> Limb
Limb Word#
0x896CF21467D7D140##, Word# -> Limb
Limb Word#
0x741496C20E7CF878##
            ,  Word# -> Limb
Limb Word#
0xE697F5E45BCD07C6##, Word# -> Limb
Limb Word#
0x9D671CD581C69BC5## #)
  in (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
x (# Limb, Limb, Limb, Limb #)
r2
{-# INLINE to# #-}

-- | Convert a 'Wider' word to the Montgomery domain.
to :: Wider -> Montgomery
to :: Wider -> Montgomery
to (Wider (# Limb, Limb, Limb, Limb #)
x) = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
to# (# Limb, Limb, Limb, Limb #)
x)

-- | Retrieve a 'Montgomery' word from the Montgomery domain.
--
--   This function is a synonym for 'retr'.
from :: Montgomery -> Wider
from :: Montgomery -> Wider
from = Montgomery -> Wider
retr

add#
  :: (# Limb, Limb, Limb, Limb #) -- ^ augend
  -> (# Limb, Limb, Limb, Limb #) -- ^ addend
  -> (# Limb, Limb, Limb, Limb #) -- ^ sum
add# :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
add# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b =
  let -- group order
      !m :: (# Limb, Limb, Limb, Limb #)
m = (# Word# -> Limb
Limb Word#
0xBFD25E8CD0364141##, Word# -> Limb
Limb Word#
0xBAAEDCE6AF48A03B##
           ,  Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFE##, Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFF## #)
  in  (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
WW.add_mod# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b (# Limb, Limb, Limb, Limb #)
m
{-# INLINE add# #-}

-- | Addition in the Montgomery domain.
--
--   Note that 'Montgomery' is an instance of 'Num', so you can use '+'
--   to apply this function.
--
--   >>> 1 + 1 :: Montgomery
--   2
add
  :: Montgomery -- ^ augend
  -> Montgomery -- ^ addend
  -> Montgomery -- ^ sum
add :: Montgomery -> Montgomery -> Montgomery
add (Montgomery (# Limb, Limb, Limb, Limb #)
a) (Montgomery (# Limb, Limb, Limb, Limb #)
b) = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
add# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b)

sub#
  :: (# Limb, Limb, Limb, Limb #) -- ^ minuend
  -> (# Limb, Limb, Limb, Limb #) -- ^ subtrahend
  -> (# Limb, Limb, Limb, Limb #) -- ^ difference
sub# :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sub# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b =
  let !m :: (# Limb, Limb, Limb, Limb #)
m = (# Word# -> Limb
Limb Word#
0xBFD25E8CD0364141##, Word# -> Limb
Limb Word#
0xBAAEDCE6AF48A03B##
           ,  Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFE##, Word# -> Limb
Limb Word#
0xFFFFFFFFFFFFFFFF## #)
  in  (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
WW.sub_mod# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b (# Limb, Limb, Limb, Limb #)
m
{-# INLINE sub# #-}

-- | Subtraction in the Montgomery domain.
--
--   Note that 'Montgomery' is an instance of 'Num', so you can use '-'
--   to apply this function.
--
--   >>> 1 - 1 :: Montgomery
--   0
sub
  :: Montgomery -- ^ minuend
  -> Montgomery -- ^ subtrahend
  -> Montgomery -- ^ difference
sub :: Montgomery -> Montgomery -> Montgomery
sub (Montgomery (# Limb, Limb, Limb, Limb #)
a) (Montgomery (# Limb, Limb, Limb, Limb #)
b) = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sub# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b)

neg#
  :: (# Limb, Limb, Limb, Limb #) -- ^ argument
  -> (# Limb, Limb, Limb, Limb #) -- ^ modular negation
neg# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
neg# (# Limb, Limb, Limb, Limb #)
a = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sub# (# Word# -> Limb
Limb Word#
0##, Word# -> Limb
Limb Word#
0##, Word# -> Limb
Limb Word#
0##, Word# -> Limb
Limb Word#
0## #) (# Limb, Limb, Limb, Limb #)
a
{-# INLINE neg# #-}

-- | Additive inverse in the Montgomery domain.
--
--   Note that 'Montgomery' is an instance of 'Num', so you can use 'negate'
--   to apply this function.
--
--   >>> negate 1 :: Montgomery
--   115792089237316195423570985008687907852837564279074904382605163141518161494336
--   >>> (negate 1 :: Montgomery) + 1
--   0
neg :: Montgomery -> Montgomery
neg :: Montgomery -> Montgomery
neg (Montgomery (# Limb, Limb, Limb, Limb #)
a) = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
neg# (# Limb, Limb, Limb, Limb #)
a)

sqr# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
a =
  let !(# (# Limb, Limb, Limb, Limb #)
l, (# Limb, Limb, Limb, Limb #)
h #) = (# Limb, Limb, Limb, Limb #)
-> (# (# Limb, Limb, Limb, Limb #), (# Limb, Limb, Limb, Limb #) #)
WW.sqr# (# Limb, Limb, Limb, Limb #)
a
  in  (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
redc# (# Limb, Limb, Limb, Limb #)
l (# Limb, Limb, Limb, Limb #)
h
{-# NOINLINE sqr# #-} -- cannot be inlined without exploding comp time

-- | Squaring in the Montgomery domain.
--
--   >>> sqr 1
--   1
--   >>> sqr 2
--   4
--   >>> sqr (negate 2)
--   4
sqr
  :: Montgomery -- ^ argument
  -> Montgomery -- ^ square
sqr :: Montgomery -> Montgomery
sqr (Montgomery (# Limb, Limb, Limb, Limb #)
a) = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
a)

-- | Zero (the additive unit) in the Montgomery domain.
zero :: Montgomery
zero :: Montgomery
zero = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery (# Word# -> Limb
Limb Word#
0##, Word# -> Limb
Limb Word#
0##, Word# -> Limb
Limb Word#
0##, Word# -> Limb
Limb Word#
0## #)

-- | One (the multiplicative unit) in the Montgomery domain.
one :: Montgomery
one :: Montgomery
one = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery
  (# Word# -> Limb
Limb Word#
0x402DA1732FC9BEBF##, Word# -> Limb
Limb Word#
0x4551231950B75FC4##
  ,  Word# -> Limb
Limb Word#
0x0000000000000001##, Word# -> Limb
Limb Word#
0x0000000000000000## #)

-- generated by etc/generate_inv.sh
inv#
  :: (# Limb, Limb, Limb, Limb #)
  -> (# Limb, Limb, Limb, Limb #)
inv# :: (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
inv# (# Limb, Limb, Limb, Limb #)
a =
  let !t0 :: (# Limb, Limb, Limb, Limb #)
t0 = (# Word# -> Limb
Limb Word#
0x402DA1732FC9BEBF##, Word# -> Limb
Limb Word#
0x4551231950B75FC4##
            ,  Word# -> Limb
Limb Word#
0x0000000000000001##, Word# -> Limb
Limb Word#
0x0000000000000000## #)
      !t1 :: (# Limb, Limb, Limb, Limb #)
t1 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t0
      !t2 :: (# Limb, Limb, Limb, Limb #)
t2 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t1
      !t3 :: (# Limb, Limb, Limb, Limb #)
t3 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t2
      !t4 :: (# Limb, Limb, Limb, Limb #)
t4 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t3
      !t5 :: (# Limb, Limb, Limb, Limb #)
t5 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t4
      !t6 :: (# Limb, Limb, Limb, Limb #)
t6 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t5
      !t7 :: (# Limb, Limb, Limb, Limb #)
t7 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t6
      !t8 :: (# Limb, Limb, Limb, Limb #)
t8 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t7
      !t9 :: (# Limb, Limb, Limb, Limb #)
t9 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t8
      !t10 :: (# Limb, Limb, Limb, Limb #)
t10 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t9
      !t11 :: (# Limb, Limb, Limb, Limb #)
t11 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t10
      !t12 :: (# Limb, Limb, Limb, Limb #)
t12 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t11
      !t13 :: (# Limb, Limb, Limb, Limb #)
t13 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t12
      !t14 :: (# Limb, Limb, Limb, Limb #)
t14 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t13
      !t15 :: (# Limb, Limb, Limb, Limb #)
t15 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t14
      !t16 :: (# Limb, Limb, Limb, Limb #)
t16 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t15
      !t17 :: (# Limb, Limb, Limb, Limb #)
t17 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t16
      !t18 :: (# Limb, Limb, Limb, Limb #)
t18 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t17
      !t19 :: (# Limb, Limb, Limb, Limb #)
t19 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t18
      !t20 :: (# Limb, Limb, Limb, Limb #)
t20 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t19
      !t21 :: (# Limb, Limb, Limb, Limb #)
t21 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t20
      !t22 :: (# Limb, Limb, Limb, Limb #)
t22 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t21
      !t23 :: (# Limb, Limb, Limb, Limb #)
t23 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t22
      !t24 :: (# Limb, Limb, Limb, Limb #)
t24 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t23
      !t25 :: (# Limb, Limb, Limb, Limb #)
t25 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t24
      !t26 :: (# Limb, Limb, Limb, Limb #)
t26 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t25
      !t27 :: (# Limb, Limb, Limb, Limb #)
t27 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t26
      !t28 :: (# Limb, Limb, Limb, Limb #)
t28 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t27
      !t29 :: (# Limb, Limb, Limb, Limb #)
t29 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t28
      !t30 :: (# Limb, Limb, Limb, Limb #)
t30 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t29
      !t31 :: (# Limb, Limb, Limb, Limb #)
t31 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t30
      !t32 :: (# Limb, Limb, Limb, Limb #)
t32 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t31
      !t33 :: (# Limb, Limb, Limb, Limb #)
t33 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t32
      !t34 :: (# Limb, Limb, Limb, Limb #)
t34 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t33
      !t35 :: (# Limb, Limb, Limb, Limb #)
t35 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t34
      !t36 :: (# Limb, Limb, Limb, Limb #)
t36 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t35
      !t37 :: (# Limb, Limb, Limb, Limb #)
t37 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t36
      !t38 :: (# Limb, Limb, Limb, Limb #)
t38 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t37
      !t39 :: (# Limb, Limb, Limb, Limb #)
t39 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t38
      !t40 :: (# Limb, Limb, Limb, Limb #)
t40 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t39
      !t41 :: (# Limb, Limb, Limb, Limb #)
t41 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t40
      !t42 :: (# Limb, Limb, Limb, Limb #)
t42 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t41
      !t43 :: (# Limb, Limb, Limb, Limb #)
t43 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t42
      !t44 :: (# Limb, Limb, Limb, Limb #)
t44 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t43
      !t45 :: (# Limb, Limb, Limb, Limb #)
t45 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t44
      !t46 :: (# Limb, Limb, Limb, Limb #)
t46 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t45
      !t47 :: (# Limb, Limb, Limb, Limb #)
t47 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t46
      !t48 :: (# Limb, Limb, Limb, Limb #)
t48 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t47
      !t49 :: (# Limb, Limb, Limb, Limb #)
t49 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t48
      !t50 :: (# Limb, Limb, Limb, Limb #)
t50 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t49
      !t51 :: (# Limb, Limb, Limb, Limb #)
t51 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t50
      !t52 :: (# Limb, Limb, Limb, Limb #)
t52 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t51
      !t53 :: (# Limb, Limb, Limb, Limb #)
t53 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t52
      !t54 :: (# Limb, Limb, Limb, Limb #)
t54 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t53
      !t55 :: (# Limb, Limb, Limb, Limb #)
t55 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t54
      !t56 :: (# Limb, Limb, Limb, Limb #)
t56 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t55
      !t57 :: (# Limb, Limb, Limb, Limb #)
t57 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t56
      !t58 :: (# Limb, Limb, Limb, Limb #)
t58 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t57
      !t59 :: (# Limb, Limb, Limb, Limb #)
t59 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t58
      !t60 :: (# Limb, Limb, Limb, Limb #)
t60 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t59
      !t61 :: (# Limb, Limb, Limb, Limb #)
t61 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t60
      !t62 :: (# Limb, Limb, Limb, Limb #)
t62 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t61
      !t63 :: (# Limb, Limb, Limb, Limb #)
t63 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t62
      !t64 :: (# Limb, Limb, Limb, Limb #)
t64 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t63
      !t65 :: (# Limb, Limb, Limb, Limb #)
t65 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t64
      !t66 :: (# Limb, Limb, Limb, Limb #)
t66 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t65
      !t67 :: (# Limb, Limb, Limb, Limb #)
t67 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t66
      !t68 :: (# Limb, Limb, Limb, Limb #)
t68 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t67
      !t69 :: (# Limb, Limb, Limb, Limb #)
t69 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t68
      !t70 :: (# Limb, Limb, Limb, Limb #)
t70 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t69
      !t71 :: (# Limb, Limb, Limb, Limb #)
t71 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t70
      !t72 :: (# Limb, Limb, Limb, Limb #)
t72 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t71
      !t73 :: (# Limb, Limb, Limb, Limb #)
t73 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t72
      !t74 :: (# Limb, Limb, Limb, Limb #)
t74 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t73
      !t75 :: (# Limb, Limb, Limb, Limb #)
t75 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t74
      !t76 :: (# Limb, Limb, Limb, Limb #)
t76 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t75
      !t77 :: (# Limb, Limb, Limb, Limb #)
t77 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t76
      !t78 :: (# Limb, Limb, Limb, Limb #)
t78 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t77
      !t79 :: (# Limb, Limb, Limb, Limb #)
t79 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t78
      !t80 :: (# Limb, Limb, Limb, Limb #)
t80 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t79
      !t81 :: (# Limb, Limb, Limb, Limb #)
t81 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t80
      !t82 :: (# Limb, Limb, Limb, Limb #)
t82 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t81
      !t83 :: (# Limb, Limb, Limb, Limb #)
t83 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t82
      !t84 :: (# Limb, Limb, Limb, Limb #)
t84 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t83
      !t85 :: (# Limb, Limb, Limb, Limb #)
t85 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t84
      !t86 :: (# Limb, Limb, Limb, Limb #)
t86 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t85
      !t87 :: (# Limb, Limb, Limb, Limb #)
t87 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t86
      !t88 :: (# Limb, Limb, Limb, Limb #)
t88 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t87
      !t89 :: (# Limb, Limb, Limb, Limb #)
t89 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t88
      !t90 :: (# Limb, Limb, Limb, Limb #)
t90 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t89
      !t91 :: (# Limb, Limb, Limb, Limb #)
t91 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t90
      !t92 :: (# Limb, Limb, Limb, Limb #)
t92 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t91
      !t93 :: (# Limb, Limb, Limb, Limb #)
t93 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t92
      !t94 :: (# Limb, Limb, Limb, Limb #)
t94 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t93
      !t95 :: (# Limb, Limb, Limb, Limb #)
t95 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t94
      !t96 :: (# Limb, Limb, Limb, Limb #)
t96 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t95
      !t97 :: (# Limb, Limb, Limb, Limb #)
t97 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t96
      !t98 :: (# Limb, Limb, Limb, Limb #)
t98 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t97
      !t99 :: (# Limb, Limb, Limb, Limb #)
t99 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t98
      !t100 :: (# Limb, Limb, Limb, Limb #)
t100 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t99
      !t101 :: (# Limb, Limb, Limb, Limb #)
t101 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t100
      !t102 :: (# Limb, Limb, Limb, Limb #)
t102 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t101
      !t103 :: (# Limb, Limb, Limb, Limb #)
t103 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t102
      !t104 :: (# Limb, Limb, Limb, Limb #)
t104 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t103
      !t105 :: (# Limb, Limb, Limb, Limb #)
t105 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t104
      !t106 :: (# Limb, Limb, Limb, Limb #)
t106 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t105
      !t107 :: (# Limb, Limb, Limb, Limb #)
t107 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t106
      !t108 :: (# Limb, Limb, Limb, Limb #)
t108 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t107
      !t109 :: (# Limb, Limb, Limb, Limb #)
t109 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t108
      !t110 :: (# Limb, Limb, Limb, Limb #)
t110 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t109
      !t111 :: (# Limb, Limb, Limb, Limb #)
t111 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t110
      !t112 :: (# Limb, Limb, Limb, Limb #)
t112 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t111
      !t113 :: (# Limb, Limb, Limb, Limb #)
t113 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t112
      !t114 :: (# Limb, Limb, Limb, Limb #)
t114 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t113
      !t115 :: (# Limb, Limb, Limb, Limb #)
t115 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t114
      !t116 :: (# Limb, Limb, Limb, Limb #)
t116 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t115
      !t117 :: (# Limb, Limb, Limb, Limb #)
t117 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t116
      !t118 :: (# Limb, Limb, Limb, Limb #)
t118 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t117
      !t119 :: (# Limb, Limb, Limb, Limb #)
t119 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t118
      !t120 :: (# Limb, Limb, Limb, Limb #)
t120 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t119
      !t121 :: (# Limb, Limb, Limb, Limb #)
t121 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t120
      !t122 :: (# Limb, Limb, Limb, Limb #)
t122 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t121
      !t123 :: (# Limb, Limb, Limb, Limb #)
t123 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t122
      !t124 :: (# Limb, Limb, Limb, Limb #)
t124 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t123
      !t125 :: (# Limb, Limb, Limb, Limb #)
t125 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t124
      !t126 :: (# Limb, Limb, Limb, Limb #)
t126 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t125
      !t127 :: (# Limb, Limb, Limb, Limb #)
t127 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t126
      !t128 :: (# Limb, Limb, Limb, Limb #)
t128 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t127
      !t129 :: (# Limb, Limb, Limb, Limb #)
t129 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t128
      !t130 :: (# Limb, Limb, Limb, Limb #)
t130 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t129
      !t131 :: (# Limb, Limb, Limb, Limb #)
t131 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t130
      !t132 :: (# Limb, Limb, Limb, Limb #)
t132 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t131
      !t133 :: (# Limb, Limb, Limb, Limb #)
t133 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t132
      !t134 :: (# Limb, Limb, Limb, Limb #)
t134 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t133
      !t135 :: (# Limb, Limb, Limb, Limb #)
t135 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t134
      !t136 :: (# Limb, Limb, Limb, Limb #)
t136 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t135
      !t137 :: (# Limb, Limb, Limb, Limb #)
t137 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t136
      !t138 :: (# Limb, Limb, Limb, Limb #)
t138 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t137
      !t139 :: (# Limb, Limb, Limb, Limb #)
t139 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t138
      !t140 :: (# Limb, Limb, Limb, Limb #)
t140 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t139
      !t141 :: (# Limb, Limb, Limb, Limb #)
t141 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t140
      !t142 :: (# Limb, Limb, Limb, Limb #)
t142 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t141
      !t143 :: (# Limb, Limb, Limb, Limb #)
t143 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t142
      !t144 :: (# Limb, Limb, Limb, Limb #)
t144 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t143
      !t145 :: (# Limb, Limb, Limb, Limb #)
t145 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t144
      !t146 :: (# Limb, Limb, Limb, Limb #)
t146 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t145
      !t147 :: (# Limb, Limb, Limb, Limb #)
t147 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t146
      !t148 :: (# Limb, Limb, Limb, Limb #)
t148 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t147
      !t149 :: (# Limb, Limb, Limb, Limb #)
t149 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t148
      !t150 :: (# Limb, Limb, Limb, Limb #)
t150 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t149
      !t151 :: (# Limb, Limb, Limb, Limb #)
t151 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t150
      !t152 :: (# Limb, Limb, Limb, Limb #)
t152 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t151
      !t153 :: (# Limb, Limb, Limb, Limb #)
t153 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t152
      !t154 :: (# Limb, Limb, Limb, Limb #)
t154 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t153
      !t155 :: (# Limb, Limb, Limb, Limb #)
t155 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t154
      !t156 :: (# Limb, Limb, Limb, Limb #)
t156 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t155
      !t157 :: (# Limb, Limb, Limb, Limb #)
t157 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t156
      !t158 :: (# Limb, Limb, Limb, Limb #)
t158 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t157
      !t159 :: (# Limb, Limb, Limb, Limb #)
t159 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t158
      !t160 :: (# Limb, Limb, Limb, Limb #)
t160 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t159
      !t161 :: (# Limb, Limb, Limb, Limb #)
t161 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t160
      !t162 :: (# Limb, Limb, Limb, Limb #)
t162 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t161
      !t163 :: (# Limb, Limb, Limb, Limb #)
t163 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t162
      !t164 :: (# Limb, Limb, Limb, Limb #)
t164 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t163
      !t165 :: (# Limb, Limb, Limb, Limb #)
t165 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t164
      !t166 :: (# Limb, Limb, Limb, Limb #)
t166 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t165
      !t167 :: (# Limb, Limb, Limb, Limb #)
t167 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t166
      !t168 :: (# Limb, Limb, Limb, Limb #)
t168 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t167
      !t169 :: (# Limb, Limb, Limb, Limb #)
t169 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t168
      !t170 :: (# Limb, Limb, Limb, Limb #)
t170 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t169
      !t171 :: (# Limb, Limb, Limb, Limb #)
t171 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t170
      !t172 :: (# Limb, Limb, Limb, Limb #)
t172 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t171
      !t173 :: (# Limb, Limb, Limb, Limb #)
t173 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t172
      !t174 :: (# Limb, Limb, Limb, Limb #)
t174 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t173
      !t175 :: (# Limb, Limb, Limb, Limb #)
t175 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t174
      !t176 :: (# Limb, Limb, Limb, Limb #)
t176 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t175
      !t177 :: (# Limb, Limb, Limb, Limb #)
t177 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t176
      !t178 :: (# Limb, Limb, Limb, Limb #)
t178 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t177
      !t179 :: (# Limb, Limb, Limb, Limb #)
t179 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t178
      !t180 :: (# Limb, Limb, Limb, Limb #)
t180 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t179
      !t181 :: (# Limb, Limb, Limb, Limb #)
t181 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t180
      !t182 :: (# Limb, Limb, Limb, Limb #)
t182 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t181
      !t183 :: (# Limb, Limb, Limb, Limb #)
t183 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t182
      !t184 :: (# Limb, Limb, Limb, Limb #)
t184 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t183
      !t185 :: (# Limb, Limb, Limb, Limb #)
t185 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t184
      !t186 :: (# Limb, Limb, Limb, Limb #)
t186 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t185
      !t187 :: (# Limb, Limb, Limb, Limb #)
t187 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t186
      !t188 :: (# Limb, Limb, Limb, Limb #)
t188 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t187
      !t189 :: (# Limb, Limb, Limb, Limb #)
t189 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t188
      !t190 :: (# Limb, Limb, Limb, Limb #)
t190 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t189
      !t191 :: (# Limb, Limb, Limb, Limb #)
t191 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t190
      !t192 :: (# Limb, Limb, Limb, Limb #)
t192 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t191
      !t193 :: (# Limb, Limb, Limb, Limb #)
t193 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t192
      !t194 :: (# Limb, Limb, Limb, Limb #)
t194 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t193
      !t195 :: (# Limb, Limb, Limb, Limb #)
t195 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t194
      !t196 :: (# Limb, Limb, Limb, Limb #)
t196 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t195
      !t197 :: (# Limb, Limb, Limb, Limb #)
t197 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t196
      !t198 :: (# Limb, Limb, Limb, Limb #)
t198 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t197
      !t199 :: (# Limb, Limb, Limb, Limb #)
t199 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t198
      !t200 :: (# Limb, Limb, Limb, Limb #)
t200 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t199
      !t201 :: (# Limb, Limb, Limb, Limb #)
t201 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t200
      !t202 :: (# Limb, Limb, Limb, Limb #)
t202 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t201
      !t203 :: (# Limb, Limb, Limb, Limb #)
t203 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t202
      !t204 :: (# Limb, Limb, Limb, Limb #)
t204 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t203
      !t205 :: (# Limb, Limb, Limb, Limb #)
t205 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t204
      !t206 :: (# Limb, Limb, Limb, Limb #)
t206 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t205
      !t207 :: (# Limb, Limb, Limb, Limb #)
t207 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t206
      !t208 :: (# Limb, Limb, Limb, Limb #)
t208 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t207
      !t209 :: (# Limb, Limb, Limb, Limb #)
t209 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t208
      !t210 :: (# Limb, Limb, Limb, Limb #)
t210 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t209
      !t211 :: (# Limb, Limb, Limb, Limb #)
t211 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t210
      !t212 :: (# Limb, Limb, Limb, Limb #)
t212 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t211
      !t213 :: (# Limb, Limb, Limb, Limb #)
t213 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t212
      !t214 :: (# Limb, Limb, Limb, Limb #)
t214 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t213
      !t215 :: (# Limb, Limb, Limb, Limb #)
t215 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t214
      !t216 :: (# Limb, Limb, Limb, Limb #)
t216 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t215
      !t217 :: (# Limb, Limb, Limb, Limb #)
t217 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t216
      !t218 :: (# Limb, Limb, Limb, Limb #)
t218 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t217
      !t219 :: (# Limb, Limb, Limb, Limb #)
t219 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t218
      !t220 :: (# Limb, Limb, Limb, Limb #)
t220 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t219
      !t221 :: (# Limb, Limb, Limb, Limb #)
t221 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t220
      !t222 :: (# Limb, Limb, Limb, Limb #)
t222 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t221
      !t223 :: (# Limb, Limb, Limb, Limb #)
t223 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t222
      !t224 :: (# Limb, Limb, Limb, Limb #)
t224 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t223
      !t225 :: (# Limb, Limb, Limb, Limb #)
t225 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t224
      !t226 :: (# Limb, Limb, Limb, Limb #)
t226 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t225
      !t227 :: (# Limb, Limb, Limb, Limb #)
t227 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t226
      !t228 :: (# Limb, Limb, Limb, Limb #)
t228 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t227
      !t229 :: (# Limb, Limb, Limb, Limb #)
t229 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t228
      !t230 :: (# Limb, Limb, Limb, Limb #)
t230 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t229
      !t231 :: (# Limb, Limb, Limb, Limb #)
t231 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t230
      !t232 :: (# Limb, Limb, Limb, Limb #)
t232 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t231
      !t233 :: (# Limb, Limb, Limb, Limb #)
t233 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t232
      !t234 :: (# Limb, Limb, Limb, Limb #)
t234 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t233
      !t235 :: (# Limb, Limb, Limb, Limb #)
t235 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t234
      !t236 :: (# Limb, Limb, Limb, Limb #)
t236 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t235
      !t237 :: (# Limb, Limb, Limb, Limb #)
t237 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t236
      !t238 :: (# Limb, Limb, Limb, Limb #)
t238 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t237
      !t239 :: (# Limb, Limb, Limb, Limb #)
t239 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t238
      !t240 :: (# Limb, Limb, Limb, Limb #)
t240 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t239
      !t241 :: (# Limb, Limb, Limb, Limb #)
t241 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t240
      !t242 :: (# Limb, Limb, Limb, Limb #)
t242 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t241
      !t243 :: (# Limb, Limb, Limb, Limb #)
t243 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t242
      !t244 :: (# Limb, Limb, Limb, Limb #)
t244 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t243
      !t245 :: (# Limb, Limb, Limb, Limb #)
t245 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t244
      !t246 :: (# Limb, Limb, Limb, Limb #)
t246 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t245
      !t247 :: (# Limb, Limb, Limb, Limb #)
t247 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t246
      !t248 :: (# Limb, Limb, Limb, Limb #)
t248 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t247
      !t249 :: (# Limb, Limb, Limb, Limb #)
t249 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t248
      !t250 :: (# Limb, Limb, Limb, Limb #)
t250 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t249
      !t251 :: (# Limb, Limb, Limb, Limb #)
t251 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t250
      !t252 :: (# Limb, Limb, Limb, Limb #)
t252 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t251
      !t253 :: (# Limb, Limb, Limb, Limb #)
t253 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t252
      !t254 :: (# Limb, Limb, Limb, Limb #)
t254 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t253
      !t255 :: (# Limb, Limb, Limb, Limb #)
t255 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t254
      !t256 :: (# Limb, Limb, Limb, Limb #)
t256 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t255
      !t257 :: (# Limb, Limb, Limb, Limb #)
t257 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t256
      !t258 :: (# Limb, Limb, Limb, Limb #)
t258 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t257
      !t259 :: (# Limb, Limb, Limb, Limb #)
t259 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t258
      !t260 :: (# Limb, Limb, Limb, Limb #)
t260 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t259
      !t261 :: (# Limb, Limb, Limb, Limb #)
t261 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t260
      !t262 :: (# Limb, Limb, Limb, Limb #)
t262 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t261
      !t263 :: (# Limb, Limb, Limb, Limb #)
t263 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t262
      !t264 :: (# Limb, Limb, Limb, Limb #)
t264 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t263
      !t265 :: (# Limb, Limb, Limb, Limb #)
t265 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t264
      !t266 :: (# Limb, Limb, Limb, Limb #)
t266 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t265
      !t267 :: (# Limb, Limb, Limb, Limb #)
t267 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t266
      !t268 :: (# Limb, Limb, Limb, Limb #)
t268 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t267
      !t269 :: (# Limb, Limb, Limb, Limb #)
t269 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t268
      !t270 :: (# Limb, Limb, Limb, Limb #)
t270 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t269
      !t271 :: (# Limb, Limb, Limb, Limb #)
t271 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t270
      !t272 :: (# Limb, Limb, Limb, Limb #)
t272 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t271
      !t273 :: (# Limb, Limb, Limb, Limb #)
t273 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t272
      !t274 :: (# Limb, Limb, Limb, Limb #)
t274 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t273
      !t275 :: (# Limb, Limb, Limb, Limb #)
t275 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t274
      !t276 :: (# Limb, Limb, Limb, Limb #)
t276 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t275
      !t277 :: (# Limb, Limb, Limb, Limb #)
t277 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t276
      !t278 :: (# Limb, Limb, Limb, Limb #)
t278 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t277
      !t279 :: (# Limb, Limb, Limb, Limb #)
t279 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t278
      !t280 :: (# Limb, Limb, Limb, Limb #)
t280 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t279
      !t281 :: (# Limb, Limb, Limb, Limb #)
t281 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t280
      !t282 :: (# Limb, Limb, Limb, Limb #)
t282 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t281
      !t283 :: (# Limb, Limb, Limb, Limb #)
t283 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t282
      !t284 :: (# Limb, Limb, Limb, Limb #)
t284 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t283
      !t285 :: (# Limb, Limb, Limb, Limb #)
t285 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t284
      !t286 :: (# Limb, Limb, Limb, Limb #)
t286 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t285
      !t287 :: (# Limb, Limb, Limb, Limb #)
t287 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t286
      !t288 :: (# Limb, Limb, Limb, Limb #)
t288 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t287
      !t289 :: (# Limb, Limb, Limb, Limb #)
t289 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t288
      !t290 :: (# Limb, Limb, Limb, Limb #)
t290 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t289
      !t291 :: (# Limb, Limb, Limb, Limb #)
t291 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t290
      !t292 :: (# Limb, Limb, Limb, Limb #)
t292 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t291
      !t293 :: (# Limb, Limb, Limb, Limb #)
t293 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t292
      !t294 :: (# Limb, Limb, Limb, Limb #)
t294 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t293
      !t295 :: (# Limb, Limb, Limb, Limb #)
t295 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t294
      !t296 :: (# Limb, Limb, Limb, Limb #)
t296 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t295
      !t297 :: (# Limb, Limb, Limb, Limb #)
t297 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t296
      !t298 :: (# Limb, Limb, Limb, Limb #)
t298 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t297
      !t299 :: (# Limb, Limb, Limb, Limb #)
t299 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t298
      !t300 :: (# Limb, Limb, Limb, Limb #)
t300 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t299
      !t301 :: (# Limb, Limb, Limb, Limb #)
t301 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t300
      !t302 :: (# Limb, Limb, Limb, Limb #)
t302 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t301
      !t303 :: (# Limb, Limb, Limb, Limb #)
t303 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t302
      !t304 :: (# Limb, Limb, Limb, Limb #)
t304 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t303
      !t305 :: (# Limb, Limb, Limb, Limb #)
t305 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t304
      !t306 :: (# Limb, Limb, Limb, Limb #)
t306 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t305
      !t307 :: (# Limb, Limb, Limb, Limb #)
t307 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t306
      !t308 :: (# Limb, Limb, Limb, Limb #)
t308 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t307
      !t309 :: (# Limb, Limb, Limb, Limb #)
t309 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t308
      !t310 :: (# Limb, Limb, Limb, Limb #)
t310 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t309
      !t311 :: (# Limb, Limb, Limb, Limb #)
t311 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t310
      !t312 :: (# Limb, Limb, Limb, Limb #)
t312 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t311
      !t313 :: (# Limb, Limb, Limb, Limb #)
t313 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t312
      !t314 :: (# Limb, Limb, Limb, Limb #)
t314 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t313
      !t315 :: (# Limb, Limb, Limb, Limb #)
t315 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t314
      !t316 :: (# Limb, Limb, Limb, Limb #)
t316 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t315
      !t317 :: (# Limb, Limb, Limb, Limb #)
t317 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t316
      !t318 :: (# Limb, Limb, Limb, Limb #)
t318 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t317
      !t319 :: (# Limb, Limb, Limb, Limb #)
t319 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t318
      !t320 :: (# Limb, Limb, Limb, Limb #)
t320 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t319
      !t321 :: (# Limb, Limb, Limb, Limb #)
t321 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t320
      !t322 :: (# Limb, Limb, Limb, Limb #)
t322 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t321
      !t323 :: (# Limb, Limb, Limb, Limb #)
t323 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t322
      !t324 :: (# Limb, Limb, Limb, Limb #)
t324 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t323
      !t325 :: (# Limb, Limb, Limb, Limb #)
t325 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t324
      !t326 :: (# Limb, Limb, Limb, Limb #)
t326 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t325
      !t327 :: (# Limb, Limb, Limb, Limb #)
t327 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t326
      !t328 :: (# Limb, Limb, Limb, Limb #)
t328 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t327
      !t329 :: (# Limb, Limb, Limb, Limb #)
t329 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t328
      !t330 :: (# Limb, Limb, Limb, Limb #)
t330 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t329
      !t331 :: (# Limb, Limb, Limb, Limb #)
t331 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t330
      !t332 :: (# Limb, Limb, Limb, Limb #)
t332 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t331
      !t333 :: (# Limb, Limb, Limb, Limb #)
t333 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t332
      !t334 :: (# Limb, Limb, Limb, Limb #)
t334 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t333
      !t335 :: (# Limb, Limb, Limb, Limb #)
t335 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t334
      !t336 :: (# Limb, Limb, Limb, Limb #)
t336 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t335
      !t337 :: (# Limb, Limb, Limb, Limb #)
t337 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t336
      !t338 :: (# Limb, Limb, Limb, Limb #)
t338 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t337
      !t339 :: (# Limb, Limb, Limb, Limb #)
t339 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t338
      !t340 :: (# Limb, Limb, Limb, Limb #)
t340 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t339
      !t341 :: (# Limb, Limb, Limb, Limb #)
t341 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t340
      !t342 :: (# Limb, Limb, Limb, Limb #)
t342 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t341
      !t343 :: (# Limb, Limb, Limb, Limb #)
t343 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t342
      !t344 :: (# Limb, Limb, Limb, Limb #)
t344 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t343
      !t345 :: (# Limb, Limb, Limb, Limb #)
t345 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t344
      !t346 :: (# Limb, Limb, Limb, Limb #)
t346 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t345
      !t347 :: (# Limb, Limb, Limb, Limb #)
t347 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t346
      !t348 :: (# Limb, Limb, Limb, Limb #)
t348 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t347
      !t349 :: (# Limb, Limb, Limb, Limb #)
t349 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t348
      !t350 :: (# Limb, Limb, Limb, Limb #)
t350 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t349
      !t351 :: (# Limb, Limb, Limb, Limb #)
t351 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t350
      !t352 :: (# Limb, Limb, Limb, Limb #)
t352 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t351
      !t353 :: (# Limb, Limb, Limb, Limb #)
t353 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t352
      !t354 :: (# Limb, Limb, Limb, Limb #)
t354 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t353
      !t355 :: (# Limb, Limb, Limb, Limb #)
t355 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t354
      !t356 :: (# Limb, Limb, Limb, Limb #)
t356 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t355
      !t357 :: (# Limb, Limb, Limb, Limb #)
t357 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t356
      !t358 :: (# Limb, Limb, Limb, Limb #)
t358 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t357
      !t359 :: (# Limb, Limb, Limb, Limb #)
t359 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t358
      !t360 :: (# Limb, Limb, Limb, Limb #)
t360 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t359
      !t361 :: (# Limb, Limb, Limb, Limb #)
t361 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t360
      !t362 :: (# Limb, Limb, Limb, Limb #)
t362 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t361
      !t363 :: (# Limb, Limb, Limb, Limb #)
t363 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t362
      !t364 :: (# Limb, Limb, Limb, Limb #)
t364 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t363
      !t365 :: (# Limb, Limb, Limb, Limb #)
t365 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t364
      !t366 :: (# Limb, Limb, Limb, Limb #)
t366 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t365
      !t367 :: (# Limb, Limb, Limb, Limb #)
t367 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t366
      !t368 :: (# Limb, Limb, Limb, Limb #)
t368 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t367
      !t369 :: (# Limb, Limb, Limb, Limb #)
t369 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t368
      !t370 :: (# Limb, Limb, Limb, Limb #)
t370 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t369
      !t371 :: (# Limb, Limb, Limb, Limb #)
t371 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t370
      !t372 :: (# Limb, Limb, Limb, Limb #)
t372 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t371
      !t373 :: (# Limb, Limb, Limb, Limb #)
t373 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t372
      !t374 :: (# Limb, Limb, Limb, Limb #)
t374 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t373
      !t375 :: (# Limb, Limb, Limb, Limb #)
t375 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t374
      !t376 :: (# Limb, Limb, Limb, Limb #)
t376 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t375
      !t377 :: (# Limb, Limb, Limb, Limb #)
t377 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t376
      !t378 :: (# Limb, Limb, Limb, Limb #)
t378 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t377
      !t379 :: (# Limb, Limb, Limb, Limb #)
t379 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t378
      !t380 :: (# Limb, Limb, Limb, Limb #)
t380 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t379
      !t381 :: (# Limb, Limb, Limb, Limb #)
t381 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t380
      !t382 :: (# Limb, Limb, Limb, Limb #)
t382 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t381
      !t383 :: (# Limb, Limb, Limb, Limb #)
t383 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t382
      !t384 :: (# Limb, Limb, Limb, Limb #)
t384 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t383
      !t385 :: (# Limb, Limb, Limb, Limb #)
t385 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t384
      !t386 :: (# Limb, Limb, Limb, Limb #)
t386 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t385
      !t387 :: (# Limb, Limb, Limb, Limb #)
t387 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t386
      !t388 :: (# Limb, Limb, Limb, Limb #)
t388 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t387
      !t389 :: (# Limb, Limb, Limb, Limb #)
t389 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t388
      !t390 :: (# Limb, Limb, Limb, Limb #)
t390 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t389
      !t391 :: (# Limb, Limb, Limb, Limb #)
t391 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t390
      !t392 :: (# Limb, Limb, Limb, Limb #)
t392 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t391
      !t393 :: (# Limb, Limb, Limb, Limb #)
t393 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t392
      !t394 :: (# Limb, Limb, Limb, Limb #)
t394 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t393
      !t395 :: (# Limb, Limb, Limb, Limb #)
t395 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t394
      !t396 :: (# Limb, Limb, Limb, Limb #)
t396 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t395
      !t397 :: (# Limb, Limb, Limb, Limb #)
t397 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t396
      !t398 :: (# Limb, Limb, Limb, Limb #)
t398 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t397
      !t399 :: (# Limb, Limb, Limb, Limb #)
t399 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t398
      !t400 :: (# Limb, Limb, Limb, Limb #)
t400 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t399
      !t401 :: (# Limb, Limb, Limb, Limb #)
t401 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t400
      !t402 :: (# Limb, Limb, Limb, Limb #)
t402 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t401
      !t403 :: (# Limb, Limb, Limb, Limb #)
t403 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t402
      !t404 :: (# Limb, Limb, Limb, Limb #)
t404 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t403
      !t405 :: (# Limb, Limb, Limb, Limb #)
t405 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t404
      !t406 :: (# Limb, Limb, Limb, Limb #)
t406 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t405
      !t407 :: (# Limb, Limb, Limb, Limb #)
t407 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t406
      !t408 :: (# Limb, Limb, Limb, Limb #)
t408 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t407
      !t409 :: (# Limb, Limb, Limb, Limb #)
t409 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t408
      !t410 :: (# Limb, Limb, Limb, Limb #)
t410 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t409
      !t411 :: (# Limb, Limb, Limb, Limb #)
t411 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t410
      !t412 :: (# Limb, Limb, Limb, Limb #)
t412 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t411
      !t413 :: (# Limb, Limb, Limb, Limb #)
t413 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t412
      !t414 :: (# Limb, Limb, Limb, Limb #)
t414 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t413
      !t415 :: (# Limb, Limb, Limb, Limb #)
t415 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t414
      !t416 :: (# Limb, Limb, Limb, Limb #)
t416 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t415
      !t417 :: (# Limb, Limb, Limb, Limb #)
t417 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t416
      !t418 :: (# Limb, Limb, Limb, Limb #)
t418 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t417
      !t419 :: (# Limb, Limb, Limb, Limb #)
t419 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t418
      !t420 :: (# Limb, Limb, Limb, Limb #)
t420 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t419
      !t421 :: (# Limb, Limb, Limb, Limb #)
t421 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t420
      !t422 :: (# Limb, Limb, Limb, Limb #)
t422 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t421
      !t423 :: (# Limb, Limb, Limb, Limb #)
t423 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t422
      !t424 :: (# Limb, Limb, Limb, Limb #)
t424 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t423
      !t425 :: (# Limb, Limb, Limb, Limb #)
t425 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t424
      !t426 :: (# Limb, Limb, Limb, Limb #)
t426 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t425
      !t427 :: (# Limb, Limb, Limb, Limb #)
t427 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t426
      !t428 :: (# Limb, Limb, Limb, Limb #)
t428 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t427
      !t429 :: (# Limb, Limb, Limb, Limb #)
t429 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t428
      !t430 :: (# Limb, Limb, Limb, Limb #)
t430 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t429
      !t431 :: (# Limb, Limb, Limb, Limb #)
t431 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t430
      !t432 :: (# Limb, Limb, Limb, Limb #)
t432 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t431
      !t433 :: (# Limb, Limb, Limb, Limb #)
t433 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t432
      !t434 :: (# Limb, Limb, Limb, Limb #)
t434 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t433
      !t435 :: (# Limb, Limb, Limb, Limb #)
t435 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t434
      !t436 :: (# Limb, Limb, Limb, Limb #)
t436 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t435
      !t437 :: (# Limb, Limb, Limb, Limb #)
t437 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t436
      !t438 :: (# Limb, Limb, Limb, Limb #)
t438 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t437
      !t439 :: (# Limb, Limb, Limb, Limb #)
t439 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t438
      !t440 :: (# Limb, Limb, Limb, Limb #)
t440 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t439
      !t441 :: (# Limb, Limb, Limb, Limb #)
t441 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t440
      !t442 :: (# Limb, Limb, Limb, Limb #)
t442 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t441
      !t443 :: (# Limb, Limb, Limb, Limb #)
t443 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t442
      !t444 :: (# Limb, Limb, Limb, Limb #)
t444 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t443
      !t445 :: (# Limb, Limb, Limb, Limb #)
t445 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t444
      !t446 :: (# Limb, Limb, Limb, Limb #)
t446 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t445
      !t447 :: (# Limb, Limb, Limb, Limb #)
t447 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t446
      !t448 :: (# Limb, Limb, Limb, Limb #)
t448 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t447
      !t449 :: (# Limb, Limb, Limb, Limb #)
t449 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t448
      !t450 :: (# Limb, Limb, Limb, Limb #)
t450 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t449
      !t451 :: (# Limb, Limb, Limb, Limb #)
t451 = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
t450
      !t452 :: (# Limb, Limb, Limb, Limb #)
t452 = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
t451
      !r :: (# Limb, Limb, Limb, Limb #)
r = (# Limb, Limb, Limb, Limb #)
t452
  in  (# Limb, Limb, Limb, Limb #)
r
{-# INLINE inv# #-}

-- | Multiplicative inverse in the Montgomery domain.
--
--   >> inv 2
--   57896044618658097711785492504343953926418782139537452191302581570759080747169
--   >> inv 2 * 2
--   1
inv
  :: Montgomery -- ^ argument
  -> Montgomery -- ^ inverse
inv :: Montgomery -> Montgomery
inv (Montgomery (# Limb, Limb, Limb, Limb #)
w) = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
inv# (# Limb, Limb, Limb, Limb #)
w)

-- | Exponentiation in the Montgomery domain.
--
--   >>> exp 2 3
--   8
--   >>> exp 2 10
--   1024
exp :: Montgomery -> Wider -> Montgomery
exp :: Montgomery -> Wider -> Montgomery
exp (Montgomery (# Limb, Limb, Limb, Limb #)
b) (Wider (# Limb, Limb, Limb, Limb #)
e) =
  let !one# :: (# Limb, Limb, Limb, Limb #)
one# = (# Word# -> Limb
Limb Word#
0x402DA1732FC9BEBF##, Word# -> Limb
Limb Word#
0x4551231950B75FC4##
              ,  Word# -> Limb
Limb Word#
0x0000000000000001##, Word# -> Limb
Limb Word#
0x0000000000000000## #)
      loop :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> t
-> (# Limb, Limb, Limb, Limb #)
loop !(# Limb, Limb, Limb, Limb #)
r !(# Limb, Limb, Limb, Limb #)
_ !(# Limb, Limb, Limb, Limb #)
_ t
0 = (# Limb, Limb, Limb, Limb #)
r
      loop !(# Limb, Limb, Limb, Limb #)
r !(# Limb, Limb, Limb, Limb #)
m !(# Limb, Limb, Limb, Limb #)
ex !t
n =
        let !(# (# Limb, Limb, Limb, Limb #)
ne, Choice
bit #) = (# Limb, Limb, Limb, Limb #)
-> (# (# Limb, Limb, Limb, Limb #), Choice #)
WW.shr1_c# (# Limb, Limb, Limb, Limb #)
ex
            !candidate :: (# Limb, Limb, Limb, Limb #)
candidate = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
mul# (# Limb, Limb, Limb, Limb #)
r (# Limb, Limb, Limb, Limb #)
m
            !nr :: (# Limb, Limb, Limb, Limb #)
nr = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> Choice
-> (# Limb, Limb, Limb, Limb #)
select# (# Limb, Limb, Limb, Limb #)
r (# Limb, Limb, Limb, Limb #)
candidate Choice
bit
            !nm :: (# Limb, Limb, Limb, Limb #)
nm = (# Limb, Limb, Limb, Limb #) -> (# Limb, Limb, Limb, Limb #)
sqr# (# Limb, Limb, Limb, Limb #)
m
        in  (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> t
-> (# Limb, Limb, Limb, Limb #)
loop (# Limb, Limb, Limb, Limb #)
nr (# Limb, Limb, Limb, Limb #)
nm (# Limb, Limb, Limb, Limb #)
ne (t
n t -> t -> t
forall a. Num a => a -> a -> a
- t
1)
  in  (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> Word
-> (# Limb, Limb, Limb, Limb #)
forall {t}.
(Eq t, Num t) =>
(# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> t
-> (# Limb, Limb, Limb, Limb #)
loop (# Limb, Limb, Limb, Limb #)
one# (# Limb, Limb, Limb, Limb #)
b (# Limb, Limb, Limb, Limb #)
e (Word
256 :: Word))

odd# :: (# Limb, Limb, Limb, Limb #) -> C.Choice
odd# :: (# Limb, Limb, Limb, Limb #) -> Choice
odd# = (# Limb, Limb, Limb, Limb #) -> Choice
WW.odd#
{-# INLINE odd #-}

-- | Check if a 'Montgomery' value is odd.
--
--   >>> odd 1
--   True
--   >>> odd 2
--   False
--   >>> Data.Word.Wider.odd (retr 3) -- parity is preserved
--   True
odd :: Montgomery -> Bool
odd :: Montgomery -> Bool
odd (Montgomery (# Limb, Limb, Limb, Limb #)
m) = Choice -> Bool
C.decide ((# Limb, Limb, Limb, Limb #) -> Choice
odd# (# Limb, Limb, Limb, Limb #)
m)

-- constant-time selection ----------------------------------------------------

select#
  :: (# Limb, Limb, Limb, Limb #) -- ^ a
  -> (# Limb, Limb, Limb, Limb #) -- ^ b
  -> C.Choice                     -- ^ c
  -> (# Limb, Limb, Limb, Limb #) -- ^ result
select# :: (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> Choice
-> (# Limb, Limb, Limb, Limb #)
select# = (# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> Choice
-> (# Limb, Limb, Limb, Limb #)
WW.select#
{-# INLINE select# #-}

-- | Return a if c is truthy, otherwise return b.
--
--   >>> import qualified Data.Choice as C
--   >>> select 0 1 (C.true# ())
--   1
select
  :: Montgomery    -- ^ a
  -> Montgomery    -- ^ b
  -> C.Choice      -- ^ c
  -> Montgomery    -- ^ result
select :: Montgomery -> Montgomery -> Choice -> Montgomery
select (Montgomery (# Limb, Limb, Limb, Limb #)
a) (Montgomery (# Limb, Limb, Limb, Limb #)
b) Choice
c = (# Limb, Limb, Limb, Limb #) -> Montgomery
Montgomery ((# Limb, Limb, Limb, Limb #)
-> (# Limb, Limb, Limb, Limb #)
-> Choice
-> (# Limb, Limb, Limb, Limb #)
select# (# Limb, Limb, Limb, Limb #)
a (# Limb, Limb, Limb, Limb #)
b Choice
c)