# CRYPTOGRAPHIE

N=30000

alphabet=c('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','.',' ',',',';',':','?','!','-',"'",'"')

M<-read.table("~/Dropbox/sylvain-rubenthaler/enseignement/m1im/monte-carlo/poly-monte-carlo/fichiers-decodage/matrice.dat")
MM<-M
la=36
for (i in 1:36)
{
	for (j in 1:36)
	{
		if (M[i,j]==0) 
		{
			MM[i,j]=1
		}
	}
}
mini=min(MM)
print(mini)
for (i in 1:36)
{
	for (j in 1:36)
	{
		if ( M[i,j]==0 )
		{
			M[i,j]=mini/1000
		}
	}
}

# Charger la phrase codée
phrase_codee=readLines("~/Dropbox/sylvain-rubenthaler/enseignement/m1im/monte-carlo/poly-monte-carlo/fichiers-decodage/liste_codee.dat")
 # On transforme les caracactères de la phrase codée en les numéros correspondant.
 code_num=c()
 for (x in phrase_codee)
 {
 	code_num=c(code_num,which(alphabet==x))
 }


# Fonction de calcul de log(pi)
fpi<-function(g)
{
	x=0
	for (i in 1:(length(code_num)-1))
	{
		x=x+log(M[g[code_num[i]],g[code_num[i+1]]])
	}  
	return(x)
}

# Fonction pour afficher le décodage
afficher<-function(g)
{
	liste=c()
	for (i in 1:length(code_num))
	{
		liste=c(liste,alphabet[g[code_num[i]]])
	}
	phrase=""
	for (x in liste)
	{
			# if (x=="\"")
			# {
				# phrase=paste(phrase,"'",sep='')
			# }
			# else
			# {
				# phrase=paste(phrase,x,sep='')
			# }
		phrase=paste(phrase,x,sep='')		
	}
	return(phrase)
}
	
# On tire un point de départ, au hasard ou pas.
f=1:la
f=sample(f,la,replace=FALSE,prob=NULL)
print(fpi(f))


for (i in 1:N)
{
	g<-f
	ech=sample(1:la,2,replace=FALSE,prob=NULL)
	g[ech[1]]=f[ech[2]]
	g[ech[2]]=f[ech[1]]
	u=runif(1,0,1)
	if (u<exp(fpi(g)-fpi(f)))
	{
		cat(fpi(f),fpi(g),"\n")
		f<-g
		cat(i/N,"accepté \n");
		print(afficher(f))
		cat("-------------------------","\n")
	}
}


