Você está na página 1de 12

Programao Funcional 6 Aula  Exemplo: a Cifra de Csar

a
Pedro Vasconcelos DCC/FCUP

2011

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

A cifra de Csar
Um dos mtodos mais simples para codicar um texto. Cada letra substituida pela que dista

posies no alfabeto.

Quando ultrapassa a letra 'z', volta letra 'a'.

Exemplo: para

k = 3, a substituio :

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 d e f g h i j k l m n o p q r s t u v w x y z a b c
Logo,  ataque

 dwdtxh.

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Problema

Escrever uma funo

cifrar :: Int -> String -> String


para implementar a cifra de Csar com um deslocamento dado (Exerccio 3.1).

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

O mdulo Char
Vamos usar algumas funes sobre caracteres denidas no mdulo

Char, e.g.:

ord :: Char -> Int chr :: Int -> Char isLower :: Char -> Bool

 cdigo numrico dum caracter  caracter dum cdigo numrico  testar se letra minscula

Para usar este mdulo, colocamos a seguinte declarao no programa:

import Char

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Resoluo
Comeamos por denir duas funes de converso entre as letras 'a'. . . 'z' e os inteiros no intervalo 0 . . . 25.

let2int :: Char -> Int let2int x = ord x - ord 'a' int2let :: Int -> Char int2let n = chr (n + ord 'a')
Note que estas funes assumem que os argumentos esto nos intervalos certos!

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Resoluo (cont.)
Denimos agora uma funo para deslocar

posies no alfabeto

as letras minsculas; os outros caracteres cam inalterados.

deslocar :: Int -> Char -> Char deslocar k x | isLower x = int2let ((let2int x+k)`mod`26) | otherwise = x

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Resoluo (cont.)
deslocar a cada caracter

A codicao consiste em aplicar a funo da cadeia dada.

cifrar :: Int -> String -> String cifrar k xs = [deslocar k x | x<-xs]

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Resoluo (cont.)
Tambm podemos usar deslocamentos negativos; por exemplo, para descodicar uma mensagem cifrada com

cifrar

(k ):

cifrar k

usamos

> cifrar "kdvnhoo > cifrar "haskell

3 "haskell e' fixe" h' ilah" (-3) "kdvnhoo h' ilah" e' fixe"

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Quebrar a cifra

Vamos agora ver como quebrar a cifra de Csar, isto , encontrar o deslocamento usado para cifrar uma mensagem.

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Quebrar a cifra (cont.)


Observamos que as letras do alfabeto tm frequncias relativas caractersticas de cada lngua; para o Portugus (em percentagens): -- frequencia relativa das letras 'a'..'z'

tabela :: [Float] tabela = [13.9, 1.0, 4.4, 5.4, 12.2, 1.0, 1.2, 0.8, 6.9, 0.4, 0.1, 2.8, 4.2, 5.3, 10.8, 2.9, 0.9, 6.9, 7.9, 4.9, 4.0, 1.3, 0.0, 0.3, 0.0, 0.4]
Fonte:

http://www.ncc.up.pt/~rvr/Main/TabelasLP.html.

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Quebrar a cifra (cont.)


Plano:

1 2 3

Calcular as frequncias relativas no texto cifrado Deslocar a tabela 0 . . . 25. Escolher o deslocamento que melhor corresponde frequncia do Portugus.

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Quebrar a cifra (cont.)


[o 1 , . . . o ]
n

Um mtodo

com

standard para comparar frequncias observadas frequncias esperadas [e1 , . . . e ] o teste


n n

chi-quadrado: quanto menor for o valor de

(o e )2
i

=1

melhor a correspondncia.

Pedro Vasconcelos DCC/FCUP

Programao Funcional 6a Aula  Exemplo: a Cifra de C

Você também pode gostar