# -*- coding: utf-8 -*-
"""
Created on Thu Jan 16 17:36:28 2025

@author: arnau
"""

import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt
import scipy.stats as stats

#%% Loi normale

def densite_normal(x):
    return 1/(np.sqrt(2*np.pi))*np.exp(-x**2/2)



#%% Poisson

def S_poisson(n,lambda_):
    '''
    Renvoie Sn pour une suite de variables indépendantes de loi P(lambda_)

    '''
    temp = rd.poisson(lambda_,n)
    return (sum(temp)-n*lambda_)/np.sqrt(n*lambda_)
 

N = 10000
lambda_ = 1
n = 1000
Poisson = []
for _ in range(N):
    '''
    simule N = 10 000 réalisation de S_poisson(1000,lambda_)
    '''
    Poisson.append(S_poisson(n,lambda_))

plt . hist (Poisson, density = True, align ='mid', rwidth = 0.8)

t = np.linspace(-5,5,1000)
densite = densite_normal(t)
plt.plot(t,densite)

#%% Géométrique 
def S_geo(n,p):
    '''
    Renvoie Sn pour une suite de variables indépendantes de loi G(p)

    '''
    temp = rd.geometric(p,n)
    return (sum(temp)-n/p)/np.sqrt(n*(1-p)/p**2)
 

N = 10000
p = 0.5
n = 1000
Geo = []
for _ in range(N):
    '''
    simule N = 10 000 réalisation de S_geo(1000,p)
    '''
    Geo.append(S_geo(n,p))

plt . hist (Geo, density = True, align ='mid', rwidth = 0.8)

t = np.linspace(-5,5,1000)
densite = densite_normal(t)
plt.plot(t,densite)

#%% Géométrique 
def S_exp(n,a):
    '''
    Renvoie Sn pour une suite de variables indépendantes de loi E(a)

    '''
    temp = rd.exponential(1/a,n)
    return (sum(temp)-n/a)/np.sqrt(n/a**2)
 

N = 10000
a = 1
n = 1000
Exp = []
for _ in range(N):
    '''
    simule N = 10 000 réalisation de S_geo(1000,p)
    '''
    Exp.append(S_exp(n,a))

plt . hist (Exp, density = True, align ='mid', rwidth = 0.8)

t = np.linspace(-5,5,1000)
densite = densite_normal(t)
plt.plot(t,densite)
#%% La pièce truquée

fichier = open('../piece.txt')
p = int(fichier.read())/100
fichier.close()

def piece_truquee():
    S = 0
    for _ in range(9604):
        if rd.rand()<p:
            S += 1/9604
    if np.abs(S-1/2)<= 2*1.96/np.sqrt(9604):
        return "on ne rejette pas que la piece est equilibre",S
    else: 
        return "on rejette que piece non equilibree",S
    
def piece_truquee2():
    S = 0
    for _ in range(9604):
        if rd.rand()<p:
            S += 1/9604
    if np.abs(S-1/2)<= 2*1.96/np.sqrt(9604):
        return 1
    else: 
        return 0
    
def test(n=1000):
    s = 0
    for k in range(n): 
        s += piece_truquee2()
    return s/n
    
#%% Test de conformité

def moyenne(L):
    return sum(L)/len(L)

def variance(L):
    s = 0
    moy = moyenne(L)
    for k in L:
        s +=(k-moy)**2
    return s/(len(L)-1)

def student(L,m):
    return (moyenne(L)-m)/np.sqrt(variance(L)/len(L))

def t(alpha,n):
    return stats.t.ppf(1-alpha/2,df=n-1)
    
sigma2 = 5

def EchantillonGaussien(n=5,mu=2):
	''' renvoie une réalisation d'un n-échantillon 
		d'une va de loi N(mu,sigma2)
	'''
	
	return rd.normal(mu,np.sqrt(sigma2),n)

def test2(L,m,alpha=0.05):
    T = student(L,m)
    talpha = t(alpha,len(L))
    intervalle = [moyenne(L)-talpha*np.sqrt(variance(L)/len(L)),moyenne(L)+talpha*np.sqrt(variance(L)/len(L))]
    if  intervalle[0]<=m<=intervalle[1]:
        rep = "H0 non rejetée"
    else:
        rep = "H0 rejetée"
    return rep, intervalle, T
    
def verification(alpha=0.05, N=1000,n=5,mu=2):
    s = 0
    for k in range(N):
       x= test2(EchantillonGaussien(n ,mu),mu,alpha)
       if x[0] == "H0 rejetée":
           s+=1
    return s/N


        