(Verso originalmente criada em bloco de notas, maximize o documento para melhor visualizao)
_________________________________________________________________________________________________
	 Manipulao de CPFs (Cadastro de Pessoa Fsica) 

Autor: --{[CRK]}--
E+mail= thereverser@hotmail.com
Website: www.thereverser.cjb.net 

Introduo:
~~~~~~~~~~~

	Quando se digita CPF para alguma identificao pessoal  feita uma checagem do seguinte modo: J que o CPF deve ter 11 dgitos, manipula-se os 9 primeiros e compara-se ao dcimo, em seguida manipula-se os 10 primeiros (com o novo obtido) e compara-se ao ltimo da sequncia. Se soubermos como manipular esta sequncia e entender a comparao saberemos como checar uma sequncia e julg-la em vlida ou falsa. E a partir disso saberemos como criar um novo nmero tambm, ento mos a obra:

Como criar seu CPF:
~~~~~~~~~~~~~~~~~~~

	Para anlise vamos inventar um nmero e ver se ele  vlido atravs do algoritmo, e ser este nmero: 123.010.222-01. O formato de um CFP  o seguinte: abc.def.ghi-xy. Inicialmente multiplicamos os nmeros desta maneira: a*10 + b*9 + c*8 + d*7 + e*6 + f*5 + ... Multiplica-se todos esses fatores como indicado e soma-se tudo, o resultado final  um nmero N. No exemplo teramos:

[Mtodo da "rvore"]

1 * 10 = 10	\	\
2 * 9 = 18	/ 28	 \
3 * 8 = 24	\ 	 / 52	\
0 * 7 = 0	/ 24	/	 \
1 * 6 = 6	\		  } 76	Soma=76
0 * 5 = 0	/ 6	\	 /
2 * 4 = 8	\ 	 \ 24	/
2 * 3 = 6	/ 14	 /
2 * 2 = 4	} 4	/

	Se no deu pra entender pela explicao, visualizando a rvore da soma acho que da pra entender. Note que multiplicamos os nmeros usando uma Progresso aritmtica; isso  realmente necessrio pois evita que as permutaes entre os dgitos gerem CPFs "equivalentes". O que quero dizer com isso  que este algoritmo  capaz de diferenciar uma sequncia "ABCD" de outra "ACBD" qualquer de mesmo nmeros porm em ordem diferente. Voltando: Obtemos neste caso o valor 76. Com o nmero resultante fazemos uma diviso por 11 (nmero de dgitos) onde obtemos um quociente inteiro e guardamos o resto da diviso. Deste modo:

76/11 = (6 * 11) + 10	resto=10

	O resto da diviso foi dez. Pegamos o resto e subtramos de 11:

X=11-resto1 => X=11-10 .. X=1

	Como o formato  abc.def.ghi-xy e X=1 nosso nmero deve ser 123.010.222-1*. Ento nos falta encontrar o nmero representado pelo asterisco (*). Usaremos um mtodo semelhante, a nica diferena  que agora ao invs de 9 vamos fazer uma rvore de 10 nmeros:

1 * 11 = 11	\
2 * 10 = 20	/ 31	\
3 * 9 = 27	\	 } 58	\
0 * 8 = 0	/ 27	/	 \
1 * 7 = 7	\	\	  \
0 * 6 = 0	/ 7	 } 7	   } 91	Soma=91
2 * 5 = 10	\	/	  /
2 * 4 = 8	/ 18	\	 /
2 * 3 = 6	\	 } 26	/
1 * 2 = 2	/ 8	/

	Novamente dividimos a soma(91) por 11 e pegamos o resto:

91/11 = (8 * 11) + 3	resto=3

	Tirando de 11, temos:
Y=11-resto2 => Y=11-3 .. Y=8

	Ento nosso ltimo dgito vlido  8, ficando com: 123.010.222-18 e este CPF  vlido ! Comparando com o nmero original (123.010.222-01) vemos que ele seria invlido. Algo deve ser considerado na diferena final (aps dividir a soma por 11 e tirar o resto):
Se o resto vale 0 ou 1 temos:
	D=11-1 => D=10
	D=11-0 => D=11
	Se fizermos isso obteremos um dgito com 2 algarismos, o que est incorreto, j que a sequncia deve ter 11 dgitos. Ento nestes casos consideramos o dgito resultante como sendo Zero. Resumindo se na diviso da soma por 11 o resto der 0 ou 1 o dgito  igual a zero!
	Este  o Algoritmo de Cadastro de Pessoa Fsica. Cheque o seu !

Gerando Nmeros CPF vlidos:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	Agora que sabemos como checar um nmero podemos criar nossos prprios CPFs. Simples: Chute nove nmeros aleatrios e encontre os dois dgitos restantes para eles, como se fosse checar! Temos: ###.###.###-XY. Chute os nmeros como quiser, Ex: 100 300 522

	Pronto ! Quanto mais zeros melhor, assim voc faz menos contas (*No usar 000.000.000!) agora aplicando o algoritmo de verificao para este nmero obtemos os dois dgitos (XY) e pronto, temos uma nova Pessoa Fsica no Brasil !
	Com este conhecimento de base matemtica  possvel criar um programa verificador ou mesmo um gerador de CPFs, depende de voc e seus conhecimentos de programador, Boa sorte ;-)


