{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Physics.Quantum.FiniteVec where
open import Data.Nat.Base using (ℕ; zero; suc)
open import Data.Fin.Base using (Fin; zero; suc)
open import Data.Product.Base using (_,_)
open import Data.Rational using (ℚ; 0ℚ; 1ℚ; _+_; _*_; _≤_)
open import Data.Rational.Base using (mkℚ; ∣_∣)
open import Data.Integer.Base using (+[1+_]; -[1+_]; +0)
open import Data.Rational.Properties using
(+-identityˡ; +-mono-≤; *-zeroˡ; *-identityˡ; 0≤∣p∣; ∣-∣-nonNeg
; *-monoʳ-≤-nonNeg; ≤-reflexive; module ≤-Reasoning)
open import Function.Base using (_∘_)
open import Relation.Binary.PropositionalEquality using
(_≡_; refl; sym; cong₂; module ≡-Reasoning)
open import ALMA.Physics.Quantum.Gaussian using (ℂ; _*ᶜ_; norm²; norm²-mul; Unit)
open import ALMA.Physics.RationalKit using (neg-neg-square)
private
abs²≡² : ∀ x → ∣ x ∣ * ∣ x ∣ ≡ x * x
abs²≡² (mkℚ +[1+ _ ] _ _) = refl
abs²≡² (mkℚ +0 _ _) = refl
abs²≡² x@(mkℚ -[1+ _ ] _ _) = let open ≡-Reasoning in begin
∣ x ∣ * ∣ x ∣
≡⟨ neg-neg-square x ⟩
x * x ∎
0≤sq : ∀ x → 0ℚ ≤ x * x
0≤sq x = begin
0ℚ
≤⟨ ≤-reflexive (sym (*-zeroˡ (∣ x ∣))) ⟩
0ℚ * ∣ x ∣
≤⟨ *-monoʳ-≤-nonNeg (∣ x ∣) {{∣-∣-nonNeg x}} (0≤∣p∣ x) ⟩
∣ x ∣ * ∣ x ∣
≡⟨ abs²≡² x ⟩
x * x ∎
where open ≤-Reasoning
sumFin : ∀ {n} → (Fin n → ℚ) → ℚ
sumFin {zero} f = 0ℚ
sumFin {suc n} f = f zero + sumFin (f ∘ suc)
sumFin-cong : ∀ {n} {f g : Fin n → ℚ} →
(∀ i → f i ≡ g i) → sumFin f ≡ sumFin g
sumFin-cong {zero} h = refl
sumFin-cong {suc n} h =
cong₂ _+_ (h zero) (sumFin-cong (h ∘ suc))
total : ∀ {n} → (Fin n → ℂ) → ℚ
total ψ = sumFin (λ k → norm² (ψ k))
phase : ∀ {n} → (u : Fin n → ℂ) → (Fin n → ℂ) → (Fin n → ℂ)
phase u ψ k = u k *ᶜ ψ k
norm²-phase : ∀ {n} (u ψ : Fin n → ℂ) →
(∀ k → Unit (u k)) →
∀ k → norm² (phase u ψ k) ≡ norm² (ψ k)
norm²-phase u ψ hu k
rewrite norm²-mul (u k) (ψ k) | hu k = *-identityˡ (norm² (ψ k))
total-phase : ∀ {n} (u ψ : Fin n → ℂ) →
(∀ k → Unit (u k)) →
total (phase u ψ) ≡ total ψ
total-phase u ψ hu = sumFin-cong (norm²-phase u ψ hu)
prob : ∀ {n} (ψ : Fin n → ℂ) (k : Fin n) → ℚ
prob ψ k = norm² (ψ k)
Normalized : ∀ {n} (ψ : Fin n → ℂ) → Set
Normalized ψ = total ψ ≡ 1ℚ
norm²-nonNeg : ∀ (z : ℂ) → 0ℚ ≤ norm² z
norm²-nonNeg (a , b) = begin
0ℚ
≤⟨ ≤-reflexive (sym (+-identityˡ 0ℚ)) ⟩
0ℚ + 0ℚ
≤⟨ +-mono-≤ (0≤sq a) (0≤sq b) ⟩
a * a + b * b ∎
where open ≤-Reasoning
prob-nonNeg : ∀ {n} (ψ : Fin n → ℂ) (k : Fin n) → 0ℚ ≤ prob ψ k
prob-nonNeg ψ k = norm²-nonNeg (ψ k)
probs-sum-to-one : ∀ {n} (ψ : Fin n → ℂ) →
Normalized ψ → sumFin (prob ψ) ≡ 1ℚ
probs-sum-to-one ψ norm = norm