#concours blanc PTSI partie 2 : une correction
#Q1
def dist(V1,V2):
    dx=V2[0]-V1[0]
    dy=V2[1]-V1[1]
    return (dx**2+dy**2)**0.5
#Q2
#le programme suivant ou équivalent sera considéré comme juste
def testdist(L):
    n=len(L)
    for i in range(n-1):
        for j in range(i+1,n):
            if dist(L[i],L[j])==0:
                return False
    return True
#néanmoins le test d'égalité entre flottants est à proscrire 
#d'où le programme suivant
def testdist(L):
    seuil=1e-8 #à définir suivant l'ordre de grandeur de longueur du problème
    n=len(L)
    for i in range(n-1):
        for j in range(i+1,n):
            if dist(L[i],L[j])<seuil:
                return False
    return True
#Q3
from math import log
def energie(L):
    n=len(L)
    H=0
    for i in range(n-1):
        for j in range(i+1,n):
            H-=-log(dist(L[i],L[j]))#ou H=H-log(dist(L[i],L[j]))
    return H #complexité en O(n**2)
#Q4
def minliste(h):
    m=h[0]
    for x in h:
        if x<m:
            m=x
    return m
#Q5
def minmat(h):
    m=h[0][0]# ou h[0,0] en Numpy
    for L in h:
        mL=minliste(L)
        if mL<m:
            m=mL
    return m
#Q6
def deuxvortex():
    h=[[0 for j in range(11)] for i in range(11)]
    #ou h=[[0]*11]*11 ou h=np.zeros(11,11) en Numpy
    V1=[0,0]
    for i in range(11):
        for j in range(11):
            V2=[-1+2/10*i,-1+2/10*j]
            h[i][j]=energie([V1,V2])
            # ou h[i,j] en Numpy
    return minmat(h)
#Q7
from random import random
#le programme suivant ou équivalent sera considéré comme juste
def troisvortex(N):
    h=[]
    V1=[0,0]
    for k in range(N):
        x2=-1+2*random()
        y2=-1+2*random()
        x3=-1+2*random()
        x3=-1+2*random()
        u=energie([V1,[x2,y2],[x3,y3]])
        h.append(u)
    return minliste(h)
#néanmoins pour s'assurer que les vortex sont distincts, on écrira
def troisvortex(N):
    h=[]
    V1=[0,0]
    for k in range(N):
        V2=[0,0]
        V3=[0,0]
        while testdist([V1,V2,V3])==False:
            V2=[-1+2*random(),-1+2*random()]
            V3=[-1+2*random(),-1+2*random()]  
        u=energie([V1,V2,V3])
        h.append(u)
    return minliste(h)
    
        
        
    










