Library PrimeGapS1.IntPoly


From Stdlib Require Import ZArith List.
Import ListNotations.
Open Scope Z_scope.


Definition pol : Type := list Z.


Fixpoint plead_aux (p : pol) (acc : Z) : Z :=
  match p with
  | [] ⇒ acc
  | x :: xs ⇒ if Z.eqb x 0 then plead_aux xs acc else plead_aux xs x
  end.

Definition plead (p : pol) : Z := plead_aux p 0.


Fixpoint peval_at_rat_aux (p : pol) (num den : Z) : Z × Z :=
  
  match p with
  | [] ⇒ (0, 1)
  | a :: rest ⇒
      let '(rest_val, rest_den_pow) := peval_at_rat_aux rest num den in
      
      (a × (den × rest_den_pow) + num × rest_val, den × rest_den_pow)
  end.

Definition peval_at_rat (p : pol) (num den : Z) : Z :=
  fst (peval_at_rat_aux p num den).