Documentation

PnP2023.Lec_03_24.Sampling

Random sampling for an element #

We implement sampling to find an element with a given property, for instance being prime or being coprime to a given number. For this we need a hypothesis that such an element exists.

We use the IO monad to generate random numbers. This is because a random number is not a function, in the sense of having value determined by arguments.

The basic way we sample is to choose an element at random from the list, and then check if it satisfies the property. If it does, we return it. If not, we remove it from the list and try again. To show termination we see (following a lab) that the length of the list decreases by at least one each time.

theorem remove_length_le {α : Type u} [DecidableEq α] (a : α) (l : List α) :

Removing an element from a list does not increase length

theorem remove_mem_length {α : Type u} [DecidableEq α] {a : α} {l : List α} (hyp : a l) :

Removing a member from a list shortens the list

We pick an index of the list l, which is of type Fin l.length. Rather than proving that the random number generator has this property we pass mod n.

def IO.randFin (n : ) (h : 0 < n) :
IO (Fin n)

A random number in Fin n

Equations
Instances For
    def pickElemIO {α : Type} [DecidableEq α] (l : List α) (p : αBool) (h : ∃ t ∈ l, p t = true) :
    IO { t : α // t l p t = true }

    A random element with a given property from a list, within IO

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For
      def pickElemD {α : Type} [DecidableEq α] (l : List α) (p : αBool) (default : α) (h₁ : default l) (h₂ : p default = true) :
      { t : α // t l p t = true }

      A random element with a given property from a list. As IO may in principle give an error, we specify a default to fallback and the conditions that this is in the list and has the property p

      Equations
      Instances For

        Random Monad #

        We used the IO Monad which has a lot of stuff besides randomness. We will now demistify this by constructing a Monad for randomness only.

        def RandomM (α : Type u_1) :
        Type u_1
        Equations
        Instances For
          def RandomM.rand (lo : ) (hi : ) :
          Equations
          Instances For
            def RandomM.run {α : Type u_1} (x : RandomM α) :
            Equations
            Instances For
              def RandomM.run' {α : Type u_1} (x : RandomM α) (gen : optParam StdGen default) :
              α
              Equations
              Instances For
                Equations
                Instances For
                  def RandomM.randList (lo : ) (hi : ) (n : ) :
                  Equations
                  Instances For
                    Equations
                    Instances For
                      def RandomM.withSeed {α : Type} (n : ) (c : RandomM α) :
                      Equations
                      Instances For
                        def StateM' (σ : Type u_1) (α : Type u_2) :
                        Type (max u_1 u_2)
                        Equations
                        Instances For
                          instance instMonadStateM' {σ : Type u_1} :
                          Equations
                          • instMonadStateM' = Monad.mk
                          def StateM'.run {σ : Type u_1} {α : Type u_2} (x : StateM' σ α) :
                          σα × σ
                          Equations
                          Instances For
                            def StateM'.run' {σ : Type u_1} {α : Type u_2} [Inhabited σ] (x : StateM' σ α) (s : optParam σ default) :
                            α
                            Equations
                            Instances For
                              def StateM'.setState {σ : Type u_1} (s : σ) :
                              Equations
                              Instances For
                                def StateM'.getState {σ : Type u_1} :
                                StateM' σ σ
                                Equations
                                Instances For
                                  def StateM'.withState {σ : Type u_1} {α : Type} (s : σ) (c : StateM' σ α) :
                                  StateM' σ α
                                  Equations
                                  Instances For
                                    def RandomM' (α : Type u_1) :
                                    Type u_1
                                    Equations
                                    Instances For