Академический Документы
Профессиональный Документы
Культура Документы
ndice
I . Abstract..................................................................................................3 1. Introduo ..............................................................................................3 1.1 Criptografia, Criptologia, CriptoAnlise, CriptoSistema ............3 2. Tcnicas e Algoritmos de Criptologia e Criptoanlise ............................4 2.1 Criptografia Clssica ..................................................................4 2.1.1 Encriptao de Csar ...........................................................4 2.1.2 Algoritmo de Vigenre.........................................................6 2.2 Criptografia Moderna ou Convencional......................................8 3. Matemtica e Criptologia .......................................................................9 3.1 Teorica dos Nmeros................................................................10 3.1.1 Definies e grupos de interesse na Teoria dos Nmeros ..........10 3.1.1.1 Nmeros Amigveis ...........................................10 3.1.1.2 Nmeros Perfeitos..............................................10 3.1.1.3 Nmeros Primos ................................................11 3.1.2 Aplicando os conceitos da Teoria dos Nmeros na Criptografia ...........11 3.2 Anlise Combinatria ...............................................................12 3.2.1 Aplicando a Teoria dos Grafos em Criptografia ......................12 3.2.2 Estatstica na Criptografia ...................................................13 3.3 Geometria.................................................................................14 3.3.1 Aplicaes de Curvas Elpticas em Criptografia ......................14 3.4 Fundamentos da Matemtica ....................................................14 3.4.1 Complexidade de Algoritmos ..............................................15 4. Concluses ...........................................................................................17 5. Bibliografia ..........................................................................................17 6. Contactos .............................................................................................17 7. Anexos .................................................................................................18
I. Abstract
Este trabalho pretende analisar algumas tcnicas de Criptologia, como criar algoritmos de encriptao e como quebrar a sua segurana usando Matemtica.
1. Introduo
Hoje em dia com o crescimento exponencial dos meios de comunicao, como telefones, telemveis, faxes, Internet, cartas, satlites, etc. Permitem-nos comunicar facilmente com algum, mesmo a longa distancias. Contudo ao enviar informao confidencial ou sensvel, estamos sujeitos a que terceiros possam ler a nossa mensagem que se destina apenas ao destinatrio. Por essas razes, informao confidencial deve ser tratada de modo diferente, como por exemplo, encriptar a informao de modo que apenas o emissor e o receptor possam tomar conhecimento do contedo mensagem enviada.
1.1
A arte e a cincia de manter a informao segura a criptografia, e praticada por criptgrafos. Por sua vez a criptoanlise a arte e a cincia de quebrar o cdigo da criptografia e praticada por criptoanalistas. A cincia da matemtica que acompanha a criptografia e a criptoanlise denominada de criptologia, e praticada por criptlogos, que tem um conhecimento profundo de matemtica terica. Um algoritmo de encriptao e tambm de desencriptao denominado de criptosistema.
U V W X Y Z A B C
U V W X Y Z
Exemplo: Roma vai ser atacada Codificado: URPD YDL VHU DWDFDGD Este texto codificado (cifra) pode ser facilmente quebrado usando para tal efeito, estatstica matemtica. Recorrendo a conceitos matemticos bsicos:
Algoritmo:
Se atribuir-mos a cada letra o equivalente de um numero (a=1, b=2, c=3, etc..), poderamos criar um algoritmo em que p (Texto normal) substituda por C (cifra) teramos: Encriptao: Para o caso especifico da encriptao de Csar C = E(P) = (p + 3) mod(26) Para um caso geral do algoritmo de Csar: C = E(p) = (p + k) mod(26) k N : 1 k 25, sendo o valor da permutao. DesEncriptao: p = D(C) = (C k ) mod(26) k N : 1 k 25, sendo o valor da permutao.
Segurana do Algoritmo:
Este tipo de criptologia clssica, hoje em dia apenas servir para um mero uso amador e no para informao realmente confidencial. Aplicando o mtodo de Fora Bruta, i.e, tentar todas as possibilidades at encontrar uma certa combinao que faa sentido, teramos 25 possibilidades para testar. Hoje em dia a capacidade dos computador actuais com um programa informtico destinado a esse fim, testar essas possibilidades faria isso em fraces de segundo tornando o cdigo ou algoritmo trivialmente quebrvel. Quebrar o Algoritmo de Csar: URPD Chave 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 TQOC SPNB ROMA QNLZ PMKY OLJX NKIW MJHV LIGU KHFT J GES IFDR HECQ GDBP FCAO EBZN DAXM CZYL BYZK AXWJ ZWVI YVUH XUTG WTSF SSRE XCK UGT WBJ TFS VAI SER UZH RDQ TYG QCP SXF PBO RWE OAN QVD NZM PUC MYL OTB LXK NSA KWJ MZ JVI LRY IUH KQX HTG JPW GSF IOV FRE HNU EQD GMT DPC FLS CO EKR BNA DJQ AMZ CIPO ZLX BHN YKY AGM XJW ZFL WIV CVCECFC BUBDBEB ATACADA ZSZBZCZ YTYAYBY XSXZXAX WRWYWZW VQVXVYV UPUWUXU TOTVTWT SNSUSVS RMRTRUR QLQSQTQ PKPRPSSP OJOQORO NINPNQN MHMOPM LGLNLOL KFKMKNK JEJLJMJ IDIKINI HCHJHLH GBGIGKG FAFGFJF RZRFRIR YDL VHU DWDFDGD
Como podemos constatar, a 3 chave ou possibilidade faz sentido. O Algoritmo de encriptao de Csar tem um tamanho de chave de cerca de 32 bits, que facilmente quebrvel e inseguro. Contudo para quebrar a segurana deste algoritmo e permitir o uso da criptoanlise atravs de Fora Bruta precisamos de saber importantes caractersticas: Ter conhecimento do algoritmo de encriptao e desencriptao Apenas temos de testar 25 chaves Conhecer a linguagem do texto descodificado 5
2.1.2 Algoritmo de Vigenre Com apenas 25 possibilidades, o algoritmo de Csar est longe de ser um criptosistema seguro. Com intuito de aumentar a fiabilidade do criptosistema, Vigenre criou uma forma alternativa de codificao: Exemplo: A = ERX ; B = 34 ; C=A; etc.. Aumentando o nmero de possibilidades usando a Fora Bruta para atacar a cifra, recorremos a uma maneira matemtica de estudar a cifra e quebra-la. Eis um exemplo: O centro de operaes de criptologia Americano, National Security Agency (NSA), destinado a espionagem electrnica intercepta uma mensagem codificada destinada a um centro de operaes Russo. A seguinte mensagem captada lia-se: UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZ VUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSX EPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ Recorrendo a uma simples estatstica matemtica para contar a frequncia dos caracteres em texto codificado temos: Frequncia dos caracteres na cifra (%) 5.83 F 3.33 B 1.67 5.00 W 3.33 G 1.67 5.00 Q 2.50 Y 1.67 4.17 T 2.50 I 0.83 4.17 A 1.67 J 0.83
P Z S U O M
H D E V X
C K L N R
Sabendo que o texto codificado est na lngua inglesa, vamos analisar a frequncia dos caracteres da lngua inglesa, sendo a lngua mais standardizada, comparando-os com a frequncia dos caracteres da cifra.
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
Ilustrao 2 Frequncia dos caracteres na lngua inglesa e na nossa cifra
Recordando a cifra UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZ VUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSX EPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ Recorrendo a Substituio dos caracteres mais frequentes da lngua inglesa pelos caracteres mais frequentes da cifra: UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZ t a e e te a that e e a a VUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSX e t ta t h e ee a e th t a EPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ e e e tat e the t Continuando o processo, como se fosse um puzzle ou uma sopa de letras conseguimos chegar ao texto descodificado: it will disclosed yesterday that several informal but direct contacts have been made with political representatives of the viet cong in moscow
Segurana do Algoritmo Cifras monoalfabticas so facilmente quebrveis porque refletem-se em estatsticas de frequncia dos caracteres do alfabeto em que foram escritas. Mais segura do que o Algoritmo de Csar, embora tambm se considera esta cifra meramente para uso amador e trivial.
O Algoritmo IDEA de encriptao, elaborado por Xuejia Lai e James Massey em 1992. Baseado de fundamentos matemticos bem slidos e complexos, o algoritmo IDEA , sendo o algoritmo tambm duas vezes mais rpido que o DES. Tendo 2128 possibilidades para um ataque de fora-bruta at quebrar cdigo, faz-nos crer que considerado um dos mais seguros, e um ataque de fora bruta a uns anos atrs num mero computador da poca poderia demorar at 1013 anos, ao comprar com a idade do universo, cerca de1010 anos, faz-nos crer que realmente muito tempo!
RSA
Sem dvida um dos algoritmos mais usados actual, tem a caracteristica de ser deChave-Publica, ou seja, temos uma chave publica e uma chave privada. A Chave publica conhecida e pode ser partilhada, mas a chave privada tem de ser mantida em segredo. Este mtodo aumenta bastante a segurana do algoritmo podendo este chegar a ter uma chave de 1024-bits, i.e, 21024 possibilidades de desEncriptao, para ter uma maior noo destas grandezas, o volume do universo cerca de 2280 cm! Este algoritmo cerca de 1000 vezes mais lento que o DES, mas sem dvida bem mais seguro. Para gerar uma chave publica, o algoritmo usa pura Matemtica, Teoria dos Nmeros, como iremos abordar mais frente, vejamos os passos para criao de uma chave: 1. Gere dois nmeros grandes de forma aleatria (e distintos) primos p e q, e os dois do mesmo tamanho. 2. Gere n, tal que: n = pq e = (p - 1)(q - 1). 3. Gere um inteiro aleatrio, E, 1 < E < , tal que MMC(E, ) = 1 4. Usa-se o algoritmo Euclidiano para gerar um unico inteiro, d 1 < d < , tal que Ed = 1 (mod ). 5. A chave publica (n, E); e a Chave privada d. NOTA: Os Algoritmos utilizados encontram-se em Anexo.
3 Matemtica e a Criptologia
A Matemtica a cincia que investiga as relaes entre entidades definidas abstrata e logicamente, ou ainda, o cincia que tem por objecto o estudo da grandeza mensurvel e calculvel. Para que os estudos dessa cincia possam avanar, a cincia Matemtica particionada em diversas divises principais, a saber:
Fundamentos da Matemtica lgebra Anlise Combinatria Anlise Matemtica Geometria Teoria dos Nmeros Topologia
Todas estas diferentes reas de matemtica tem o uso na criptografia, ajudando-a a tornar-se cada vez mais complexa.
3.1.1 Definies e grupos de interesse na Teoria dos Nmeros 3.1.1.1 Nmeros Amigveis
Tambm encontrados na literatura como "nmeros amigos", so pares de Nmeros onde cada um igual soma dos divisores do outro. Os rabes, em especial, desenvolveram diversos algoritmos para a determinao de nmeros amigveis. O quadro a seguir apresenta alguns desses nmeros.
Nmeros Amigos 220 e 284 Nmeros 220 284 Factores
1,2,4,5,10,11,20,22,44,55,110 1,2,4,71,142
Observa-se, no quadro acima, que a soma de todos os factores de 220 resulta em 284; por sua vez, a soma dos factores de 284 resulta em 220. No foram encontrados Muitos nmeros amigos: 1184 e 1210; 2620 e 2924; 5020 e 5564; e 6232 e 6368. Recentemente, os matemticos extenderam essa ideia para cadeia de nmeros amigveis, sendo a soma dos factores do ltimo da cadeia, o valor do primeiro.
de seus factores - 1, 2 e 3 - resulta em 6. Euclides props - e pode-se expressar em um formalismo dos dias actuais - que um nmero N da forma (2n - 1)* 2(n-1) um nmero perfeito, se o factor (2n - 1) 10 for um nmero primo. Assim, para n = 2, 3, 5 ou 7, a expresso (2n - 1) assume os valores 3, 7, 31 ou 127 - os quais so tambm primos. Para esses valores, podem-se obter o nmeros perfeitos 6, 28, 496 e 8128. O estudo de nmeros perfeitos levou Fermat a estudos que possibilitaram base a seu teorema, e serve de base para o estudo das fraces continuadas uma das tendncias Matemticas para Criptografia.
Inicializao: Ler p Primo := Verdadeiro Iterao: r := (2 p/2- 1)/2*p Para i := 1 at r faa M(p) MOD primo(r) = 0 ento Primo := False Trmino: Se Primo ento imprimir "M(p) Primo" Seno imprimir "M(p) no primo" Sada: Mensagem de status: ou M(p) primo, ou no . NOTA: A respectiva adaptao em Linguagem de programao C, encontra-se em anexo.
11
A subdiviso de interesse para a Criptografia a Teoria dos Grafos com a contribuio significativa para a Criptografia de blocos -, conforme ver-se- a seguir. Contudo, a Estatstica e a Probabilidade tm tambm aplicao, vista a importncia dos primeiros mtodos de Criptoanlise.
12
NOTA: Em Anexo est um programa em C para contabilizar a frequncia dos caracteres num texto.
13
3.3 Geometria
As principais subdivises da Geometria so a Geometria Geral, as Geometrias Euclidiana e pseudo-Euclidiana, a Geometria Analtica, a Geometria projectiva, a Trigonometria, os Conjuntos convexos, a Geometria Descritiva, a Geometria Diferencial e a Geometria das Curvas Elpticas.
Sucintamente, explicamos as aplicaes das Curvas Elpticas, sendo essas as mais importantes da rea de Geometria na Criptografia.
14
Para os estudos de classes de complexidade de problemas, normalmente empregam-se os problemas de Deciso, visto a maior simplicidade entre os problemas associados. Com relao representao, emprega-se em geral o termo O. Dado um algoritmo e o tamanho de sua entrada - n -, diz-se que a complexidade :
Linear - se o tempo para sua execuo O(n); Polinomial - se o tempo para a sua execuo O(nt), para algum t constante; Exponencial - se o tempo para a sua execuo O(th(n)), para alguma constante t, e um polinmio h(n).
15
Como se poderia calcular a complexidade de determinado algoritmo? Atravs do nmero de operaes. Pode-se verificar o nmero de iteraes de seus laos, por exemplo; no caso das repeties condicionais, pode-se avaliar o pior caso - ou seja, quando ocorre o maior nmero de repeties. Nos casos de decises, assume-se o pior caso. H autores que buscam utilizar-se dos casos mdios - ou seja, considerando-se a mdia entre o nmero de ocorrncias do pior caso, e do melhor caso.
Algoritmo Exemplo;
n, i, j: integer; x, Poli: real; A, S: array [0..100] of real; BEGIN Read(x,n); For i:= 0 to n do Begin S[i] := 1; Read (a[i); For j := 1 to i do S[i] := x * S[i]; S[i] := A[i] * S[i]; End; {for} Poli := 0; For i := 0 to n do Poli := Poli + S[i]; Write ('O valor em ',x,' : ', Poli); END;
16
4. Consideraes Finais
Sem dvida que o papel da Matemtica fundamental para o desenvolvimento e anlise da Criptografia, como j vimos. Com o auxilio dos computadores, que cada dia se tornam mais potentes, podemos criar e quebrar CriptoSistemas cada vez mais complexos, e com o desenvolvimento rpido das novas tecnologias e o aumento da preocupao do direito privacidade, faz com que esta rea, a Criptologia nunca pare de crescer.
5. Bibliografia
Applied Cryptography, Bruce Schneier. o Cota Biblioteca ISEC: 1A 16 3
6. Contacto
Andr Tenreiro de Almeida Numero Interno: 21120610 Regime: Misto Email: a_tenreiro@alunos.deis.isec.pt
17
7. Anexo
Nesta seco encontram-se programas em C e Algoritmos Matemticos usados para a criao e anlise Criptolgica.
Progama em C para Calcular a Frequencia dos Caracteres num texto :
/* Instituto Superior de Engenharia de Coimbra Departamento de Engeharia Informatica e de Sistemas Analise Matematica II Trabalho de Criptografia Andre Mendonca Tenreiro de Almeida NI: 21120610 01/06/03 */ #include <stdio.h> #include <stdlib.h> struct data { int total; int A, B, C, N, O, P, int a, b, c, n, o, p, int numb; int others; } var;
D, Q, d, q,
E, R, e, r,
F, S, f, s,
G, T, g, t,
H, U, h, u,
I, V, i, v,
J, W, j, w,
K, X, k, x,
L, Y, l, y,
M, Z; m, z;
int main(int argc, char **argv) { FILE *fp, *fp2; char *filename, *filename2; char chr; float f_A, f_B, f_C, f_D, f_N, f_O, f_P, f_Q, f_a, f_b, f_c, f_d, f_n, f_o, f_p, f_q, f_numb, f_others; f_E, f_R, f_e, f_r, f_F, f_S, f_f, f_s, f_G, f_T, f_g, f_t, f_H, f_U, f_h, f_u, f_I, f_V, f_i, f_v, f_J, f_W, f_j, f_w, f_K, f_X, f_k, f_x, f_L, f_Y, f_l, f_y, f_M, f_Z, f_m, f_z,
if (argc != 3) { printf("\n\n"); printf("++++++++++++++++++++++++++++++++++++++++\n"); printf("++ Analise Matematica II ++\n"); printf("++++++++++++++++++++++++++++++++++++++++\n"); printf("+ Contador para Criptografia Classica ++\n"); printf("++++++++++++++++++++++++++++++++++++++++\n\n"); printf("usagem: %s input.txt output.txt\n\n", argv[0]); exit(1); }
18
filename = argv[1]; filename2 = argv[2]; fp = fopen(filename, "r"); if (fp == NULL) { printf("ERRO: Ficheiro inexistente \"%s\".\n", filename); exit(1); } fp2 = fopen(filename2, "w"); if (fp2 == NULL) { printf("ERRO: Ficheiro inexistente \"%s\".\n", filename2); exit(1); }
printf("Espere..."); while(fread(&chr, 1, 1, fp) != 0) { if (chr == ' ') { /* null, nao faz nada */ } if (chr == 'a') { var.total++; var.a++; } if (chr == 'b') { var.total++; var.b++; } if (chr == 'c') { var.total++; var.c++; } if (chr == 'd') { var.total++; var.d++; } if (chr == 'e') { var.total++; var.e++; } if (chr == 'f') { var.total++; var.f++; } if (chr == 'g') { var.total++; var.g++; } if (chr == 'h') {
19
var.total++; var.h++; } if (chr == 'i') { var.total++; var.i++; } if (chr == 'j') { var.total++; var.j++; } if (chr == 'k') { var.total++; var.k++; } if (chr == 'l') { var.total++; var.l++; } if (chr == 'm') { var.total++; var.m++; } if (chr == 'n') { var.total++; var.n++; } if (chr == 'o') { var.total++; var.o++; } if (chr == 'p') { var.total++; var.p++; } if (chr == 'q') { var.total++; var.q++; } if (chr == 'r') { var.total++; var.r++; } if (chr == 's') { var.total++; var.s++; } if (chr == 't') { var.total++;
20
var.t++; } if (chr == 'u') { var.total++; var.u++; } if (chr == 'v') { var.total++; var.v++; } if (chr == 'w') { var.total++; var.w++; } if (chr == 'x') { var.total++; var.x++; } if (chr == 'y') { var.total++; var.y++; } if (chr == 'z') { var.total++; var.z++; } if (chr == 'A') { var.total++; var.A++; } if (chr == 'B') { var.total++; var.B++; } if (chr == 'C') { var.total++; var.C++; } if (chr == 'D') { var.total++; var.D++; } if (chr == 'E') { var.total++; var.E++; } if (chr == 'F') { var.total++; var.F++;
21
} if (chr == 'G') { var.total++; var.G++; } if (chr == 'H') { var.total++; var.H++; } if (chr == 'I') { var.total++; var.I++; } if (chr == 'J') { var.total++; var.J++; } if (chr == 'K') { var.total++; var.K++; } if (chr == 'L') { var.total++; var.L++; } if (chr == 'M') { var.total++; var.M++; } if (chr == 'N') { var.total++; var.N++; } if (chr == 'O') { var.total++; var.O++; } if (chr == 'P') { var.total++; var.Q++; } if (chr == 'Q') { var.total++; var.Q++; } if (chr == 'R') { var.total++; var.R++; }
22
if (chr == 'S') { var.total++; var.S++; } if (chr == 'T') { var.total++; var.T++; } if (chr == 'U') { var.total++; var.U++; } if (chr == 'V') { var.total++; var.V++; } if (chr == 'W') { var.total++; var.W++; } if (chr == 'X') { var.total++; var.X++; } if (chr == 'Y') { var.total++; var.Y++; } if (chr == 'Z') { var.total++; var.Z++; }
/* teste de condicao de numeros*/ if (chr >= '0' || chr <= '9') { var.total++; var.numb++; } /* teste de condicoes nao alfanumericos */ else { var.total++; var.others++; } } /* end of while */ printf("done!\n\n"); f_a = (float)(var.a * 100) / var.total; f_A = (float)(var.A * 100) / var.total; f_b = (float)(var.b * 100) / var.total;
23
f_B = (float)(var.B * 100) / var.total; f_c = (float)(var.c * 100) / var.total; f_C = (float)(var.C * 100) / var.total; f_d = (float)(var.d * 100) / var.total; f_D = (float)(var.D * 100) / var.total; f_e = (float)(var.e * 100) / var.total; f_E = (float)(var.E * 100) / var.total; f_f = (float)(var.g * 100) / var.total; f_F = (float)(var.G * 100) / var.total; f_g = (float)(var.g * 100) / var.total; f_G = (float)(var.G * 100) / var.total; f_h = (float)(var.h * 100) / var.total; f_H = (float)(var.H * 100) / var.total; f_i = (float)(var.i * 100) / var.total; f_I = (float)(var.I * 100) / var.total; f_j = (float)(var.j * 100) / var.total; f_J = (float)(var.J * 100) / var.total; f_k = (float)(var.k * 100) / var.total; f_K = (float)(var.K * 100) / var.total; f_l = (float)(var.l * 100) / var.total; f_L = (float)(var.L * 100) / var.total; f_m = (float)(var.m * 100) / var.total; f_M = (float)(var.M * 100) / var.total; f_n = (float)(var.n * 100) / var.total; f_N = (float)(var.N * 100) / var.total; f_o = (float)(var.o * 100) / var.total; f_O = (float)(var.O * 100) / var.total; f_p = (float)(var.p * 100) / var.total; f_P = (float)(var.P * 100) / var.total; f_q = (float)(var.q * 100) / var.total; f_Q = (float)(var.Q * 100) / var.total; f_r = (float)(var.r * 100) / var.total; f_R = (float)(var.R * 100) / var.total; f_s = (float)(var.s * 100) / var.total; f_S = (float)(var.S * 100) / var.total; f_t = (float)(var.t * 100) / var.total; f_T = (float)(var.T * 100) / var.total; f_u = (float)(var.u * 100) / var.total; f_U = (float)(var.U * 100) / var.total; f_v = (float)(var.v * 100) / var.total; f_V = (float)(var.V * 100) / var.total; f_w = (float)(var.w * 100) / var.total; f_W = (float)(var.W * 100) / var.total; f_x = (float)(var.x * 100) / var.total; f_X = (float)(var.X * 100) / var.total; f_y = (float)(var.y * 100) / var.total; f_Y = (float)(var.Y * 100) / var.total; f_z = (float)(var.z * 100) / var.total; f_Z = (float)(var.Z * 100) / var.total; f_numb = (float)(var.numb * 100) / var.total; f_others = (float)(var.others * 100) / var.total;
fprintf(fp2, "++++++++++++++++++++++++++++++++++++++++++\n"); fprintf(fp2, "+ Analise Matematica II ++\n"); fprintf(fp2, "++++++++++++++++++++++++++++++++++++++++++\n"); fprintf(fp2, "+ Contador para criptografia classica ++\n"); fprintf(fp2, "++++++++++++++++++++++++++++++++++++++++++\n\n"); fprintf(fp2, "Input file: %s data: %s hora: %s\n", filename, __DATE__, __TIME__); fprintf(fp2, "\n\n");
24
fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2, fprintf(fp2,
"Caracts Totais: %d \n\n", var.total); "Charcts Totais: Percentagem\n\n"); "A:%8d %16.2f\n", var.A, f_A); "a:%8d %16.2f\n", var.a, f_a); "B:%8d %16.2f\n", var.B, f_b); "b:%8d %16.2f\n", var.b, f_B); "C:%8d %16.2f\n", var.C, f_C); "c:%8d %16.2f\n", var.c, f_c); "D:%8d %16.2f\n", var.D, f_D); "d:%8d %16.2f\n", var.d, f_d); "E:%8d %16.2f\n", var.E, f_E); "e:%8d %16.2f\n", var.e, f_e); "F:%8d %16.2f\n", var.F, f_F); "f:%8d %16.2f\n", var.f, f_f); "G:%8d %16.2f\n", var.G, f_G); "g:%8d %16.2f\n", var.g, f_g); "H:%8d %16.2f\n", var.H, f_H); "h:%8d %16.2f\n", var.h, f_h); "I:%8d %16.2f\n", var.I, f_I); "i:%8d %16.2f\n", var.i, f_i); "J:%8d %16.2f\n", var.J, f_J); "j:%8d %16.2f\n", var.j, f_j); "K:%8d %16.2f\n", var.K, f_K); "k:%8d %16.2f\n", var.k, f_k); "L:%8d %16.2f\n", var.L, f_L); "l:%8d %16.2f\n", var.l, f_l); "M:%8d %16.2f\n", var.M, f_M); "m:%8d %16.2f\n", var.m, f_m); "N:%8d %16.2f\n", var.N, f_N); "n:%8d %16.2f\n", var.n, f_n); "O:%8d %16.2f\n", var.O, f_O); "o:%8d %16.2f\n", var.o, f_o); "P:%8d %16.2f\n", var.P, f_P); "p:%8d %16.2f\n", var.p, f_p); "Q:%8d %16.2f\n", var.Q, f_Q); "q:%8d %16.2f\n", var.q, f_q); "R:%8d %16.2f\n", var.R, f_R); "r:%8d %16.2f\n", var.r, f_r); "S:%8d %16.2f\n", var.S, f_S); "s:%8d %16.2f\n", var.s, f_s); "T:%8d %16.2f\n", var.T, f_T); "t:%8d %16.2f\n", var.t, f_t); "U:%8d %16.2f\n", var.U, f_U); "u:%8d %16.2f\n", var.u, f_u); "V:%8d %16.2f\n", var.V, f_V); "v:%8d %16.2f\n", var.v, f_v); "W:%8d %16.2f\n", var.W, f_W); "w:%8d %16.2f\n", var.w, f_w); "X:%8d %16.2f\n", var.X, f_X); "x:%8d %16.2f\n", var.x, f_x); "Y:%8d %16.2f\n", var.Y, f_Y); "y:%8d %16.2f\n", var.y, f_y); "Z:%8d %16.2f\n", var.Z, f_Z); "z:%8d %16.2f\n", var.z, f_z); "Numeros:%8d %16.2f\n", var.numb, f_numb); "Outros:%8d %16.2f\n", var.others, f_others); "\n");
25
Calculo do MMC em C:
#include <stdio.h> int MMC(en1, int den2) { int mmc, resto; if (den1 < den2) { mmc = den1 - 1; } else { mmc = den2 -1; } do { mmc = mmc + 1 resto=(mmc%den1)+(mmc%den2); } while (resto > 0); return mmc; } int main(void) { int num1, den1 int num2, den2;
26
int mmc, resto; scanf(%d %d, &num1, &den1); scanf(%d %d, &num2, &den2); mmc = MMC(den1, den2); num = num1 * (mmc / den1); num += num2 * (mmc / den2); printf(%d /%d, num, mmc); return 1; }
Algoritmo Euclidiano
Inicializao: r := 0 Interao: aplica-se o algoritmo de diviso de a por b, obtendo-se o resto r1 ; se r1 0, divide-se b por r1, obtendo-se o resto r2; se r2 0, divide-se r3 por r2, obtendo-se o resto r3. Trmino: quando terminar o algoritmo de diviso O MDC ser o ltimo rn 0.
Inicializao: total := 0 i := 1 Iterao: Enquanto (total 2) e (i n) faa grau := 0 Para j := 1 to n faa grau := grau + M[i,j] se impar(grau) ento total := total + 1 i := i + 1 Trmino: Se total > 2 ento imprimir no existe caminho Euleriano Seno imprimir existe caminho Euleriano
27