#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import random
import numpy as np
from math import comb as binom
from matplotlib.pyplot import figure, title, hist, plot

"""
On choisit une partie A de cardinal m dans l'ensemble [[1,n]]. 
On étudie les variables M = max(A) et X = max(A)-min(A). 
"""

# simulation des deux variables 

def va_X(n, m):
    A = random.sample(range(n), m)
    X = max(A) - min(A) 
    return X

def va_M(n, m):
    A = random.sample(range(1, n+1), m)
    M = max(A) 
    return M

# Les valeurs calculées des lois et des espérances

def dist_theorique_M(n, m):
    loi = []
    for k in range(m, n+1):
        pr = binom(k-1, m-1)/binom(n, m)
        loi.append(pr)
    return loi

def esp_M(n, m):
    return m*(n+1)/(m+1)

def dist_theorique_X(n, m):
    loi = []
    for q in range(m-1, n):
        pr = (n-q)*binom(q-1, m-2)/binom(n, m)
        loi.append(pr)
    return loi        

def esp_X(n, m):
    return (m-1)*(n+1)/(m+1)

# Exploitation de la simulation pour vérifier la distribution 
# et l'expression de l'espérance

VA = { "M":va_M, "X":va_X }
moyenne = { "M":esp_M, "X":esp_X }
    
def echantillon(va, n, m, N):
    ech = [ va(n,m) for i in range(N) ]
    return ech

def moy_empirique(id_va, n, m, N=10000):
    ech = echantillon(VA[id_va], n, m, N)
    moy_emp = sum(ech)/N
    esperance = moyenne[id_va](n, m)
    err_relative = 100*(esperance-moy_emp)/esperance
    return moy_emp, err_relative

def dist_empirique(n, m, N=10000):
    figure(1)
    title("Loi du maximum")
    subdivision = np.linspace(m-.5, n+.5, n-m+2)
    milieux = (subdivision[1:]+subdivision[:-1])/2
    ech = echantillon(va_M, n, m, N)
    hist(ech, subdivision, density=True)
    plot(milieux, dist_theorique_M(n, m), 'r*')    
    figure(2)
    title("Loi de l'écart")
    subdivision = np.linspace(m-1.5, n-.5, n-m+2)
    milieux = (subdivision[1:]+subdivision[:-1])/2
    ech = echantillon(va_X, n, m, N)
    hist(ech, subdivision, density=True)
    plot(milieux, dist_theorique_X(n, m), 'bo')    
    