# Documentation

Init.Data.Fin.Basic

instance Fin.coeToNat {n : Nat} :
Equations
• Fin.coeToNat = { coe := fun v => v.val }
def Fin.elim0 {α : Sort u} :
Fin 0α
Equations
• = match x with | { val := val, isLt := h } => absurd h (_ : ¬val < 0)
def Fin.succ {n : Nat} :
Fin nFin ()
Equations
• = match x with | { val := i, isLt := h } => { val := i + 1, isLt := (_ : ) }
def Fin.ofNat {n : Nat} (a : Nat) :
Fin ()
Equations
• = { val := a % (n + 1), isLt := (_ : a % (n + 1) < n + 1) }
def Fin.ofNat' {n : Nat} (a : Nat) (h : n > 0) :
Fin n
Equations
• = { val := a % n, isLt := (_ : a % n < n) }
def Fin.add {n : Nat} :
Fin nFin nFin n
Equations
• Fin.add x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := (a + b) % n, isLt := (_ : (a + b) % n < n) }
def Fin.mul {n : Nat} :
Fin nFin nFin n
Equations
• Fin.mul x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := a * b % n, isLt := (_ : a * b % n < n) }
def Fin.sub {n : Nat} :
Fin nFin nFin n
Equations
• Fin.sub x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := (a + (n - b)) % n, isLt := (_ : (a + (n - b)) % n < n) }

Remark: mod/div/modn/land/lor can be defined without using (% n), but we are trying to minimize the number of Nat theorems needed to boostrap Lean.

def Fin.mod {n : Nat} :
Fin nFin nFin n
Equations
• Fin.mod x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := a % b % n, isLt := (_ : a % b % n < n) }
def Fin.div {n : Nat} :
Fin nFin nFin n
Equations
• Fin.div x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := a / b % n, isLt := (_ : a / b % n < n) }
def Fin.modn {n : Nat} :
Fin nNatFin n
Equations
• Fin.modn x x = match x, x with | { val := a, isLt := h }, m => { val := a % m % n, isLt := (_ : a % m % n < n) }
def Fin.land {n : Nat} :
Fin nFin nFin n
Equations
• Fin.land x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := Nat.land a b % n, isLt := (_ : Nat.land a b % n < n) }
def Fin.lor {n : Nat} :
Fin nFin nFin n
Equations
• Fin.lor x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := Nat.lor a b % n, isLt := (_ : Nat.lor a b % n < n) }
def Fin.xor {n : Nat} :
Fin nFin nFin n
Equations
• Fin.xor x x = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := Nat.xor a b % n, isLt := (_ : Nat.xor a b % n < n) }
def Fin.shiftLeft {n : Nat} :
Fin nFin nFin n
Equations
• = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := a <<< b % n, isLt := (_ : a <<< b % n < n) }
def Fin.shiftRight {n : Nat} :
Fin nFin nFin n
Equations
• = match x, x with | { val := a, isLt := h }, { val := b, isLt := isLt } => { val := a >>> b % n, isLt := (_ : a >>> b % n < n) }
instance Fin.instAddFin {n : Nat} :
Equations
instance Fin.instSubFin {n : Nat} :
Sub (Fin n)
Equations
• Fin.instSubFin = { sub := Fin.sub }
instance Fin.instMulFin {n : Nat} :
Mul (Fin n)
Equations
• Fin.instMulFin = { mul := Fin.mul }
instance Fin.instModFin {n : Nat} :
Mod (Fin n)
Equations
• Fin.instModFin = { mod := Fin.mod }
instance Fin.instDivFin {n : Nat} :
Div (Fin n)
Equations
• Fin.instDivFin = { div := Fin.div }
instance Fin.instAndOpFin {n : Nat} :
Equations
• Fin.instAndOpFin = { and := Fin.land }
instance Fin.instOrOpFin {n : Nat} :
OrOp (Fin n)
Equations
• Fin.instOrOpFin = { or := Fin.lor }
instance Fin.instXorFin {n : Nat} :
Xor (Fin n)
Equations
• Fin.instXorFin = { xor := Fin.xor }
Equations
• Fin.instShiftLeftFin = { shiftLeft := Fin.shiftLeft }
Equations
• Fin.instShiftRightFin = { shiftRight := Fin.shiftRight }
Equations