• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

spinny

o famoso numero do "quadradinho" - no BI

17 mensagens neste tópico

depois de uma acessa discusao com alguns apologistas que o numero que se encontra no BI indica o numero de pessoas com o mesmo nome, decidi investigar um pouco e desmistificar este "mito urbano".

este digito serve para fazer a validacao do numero do BI. e um digito de control (embora este sistema tenha uma falha).

passo a explicar o processo de validacao do numero de um BI:

1) da direita para a esquerda, multiplica-se o digito pela posicao em que este se encontra

2) soma-se os valores que resultam dessas multiplicacoes

3) divide-se o resultado por 11 - se o resto da divisao for 0, o numero e valido

ex: nro do BI: 19283745[1]

digito:      1  5  4  7  3  8  2  9  [1]

posicao:    1  2  3  4  5  6  7  8    9

              1*1 + 5*2 + 4*3 + 7*4 + 3*5 + 8*6 + 2*7 + 9*8 + 1*9 = 209

              209 % 11 = 0

em relacao a falha deste sistema:

o digito 0 pode representar 0 ou 10. isso faz com que existam 11 valores possiveis (0-10) quando so e possivel utilizar um digito (0-9).

isto faz com que seja impossivel verificar a validade de ~9,09% dos BI's tugas

#include <windows.h>
#include <stdio.h>

char *readline(FILE *f)
{
char *ret=NULL;
int retsz=0;

while (true) {
	ret=(char *)realloc(ret,retsz+1);
	ret[retsz]=fgetc(f);
	if ((ret[retsz]=='\n')||
		(ret[retsz]=='\r')||
		(ret[retsz]==0)||
		ferror(f)||
		feof(f)) {
			ret[retsz]=0;
			break;}
	retsz++;}

return ret;
}

bool isvalidBI(char *nrbi)
{
int ac=0;
int nrbisz=strlen(nrbi);

printf("\n");
for (int aa=0;aa<nrbisz;aa++) {
	int pos=nrbisz-aa-1;
	printf("%c*%i %c ",
		nrbi[pos],aa+1,aa==nrbisz-1?'=':'+');
	ac+=(nrbi[pos]-'0')*(aa+1);}
printf("%i\n\n%i %% 11 = %i (%svalido)\n",
	ac,ac,ac%11,ac%11?"in":"");

return ac%11?false:true;
}

char getBIcontrolnr(char *nrbi)
{
int ac=0;
int nrbisz=strlen(nrbi);

printf("\n");
for (int aa=0;aa<nrbisz;aa++) {
	int pos=nrbisz-aa-1;
	printf("%c * %i   %c   ",
		nrbi[pos],aa+2,aa==nrbisz-1?'=':'+');
	ac+=(nrbi[pos]-'0')*(aa+2);}
printf("%i\n\n%i %% 11 = %i\n\n11 - %i = %i\n",
	ac,ac,ac%11,ac%11,11-ac%11);
return 11-ac%11;
}

int main(int argc,char **argv)
{
printf("inserir numero do bi> ");
char *nbi=readline(stdin);

printf("\n\t0 - validar bi\n\t1 - calcular digito de control\n\noperacao (%s) > ",nbi);
char op=fgetc(stdin);

if (op=='0') {
	isvalidBI(nbi);}
else if (op=='1') {
	char cnr=getBIcontrolnr(nbi);}
else {
	printf("\noperacao invalida\n");}

return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depois de uma acessa discusao com alguns apologistas que o numero que se encontra no BI indica o numero de pessoas com o mesmo nome, decidi investigar um pouco e desmistificar este "mito urbano".

este digito serve para fazer a validacao do numero do BI. e um digito de control (embora este sistema tenha uma falha).

passo a explicar o processo de validacao do numero de um BI:

1) da direita para a esquerda, multiplica-se o digito pela posicao em que este se encontra

2) soma-se os valores que resultam dessas multiplicacoes

3) divide-se o resultado por 11 - se o resto da divisao for 0, o numero e valido

boas,

bem eu ja estudei isso...

Conselhos: ( nao vi codigo....mas....)

1º  coloca system("PAUSE");

2º  para 1 bi  quando escolho validar o programa diz spr invalido...tens que ver isso...

3º deves dar ao utilizador para escrever o bi e o numero de controlo...e teres na mm as opcoes que tens...

mto bem.... ;)

quem saber sobre o isbn vejam  aqui

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o digito de control deve ser digitado apenas na opcao de validacao

tofas: o digito de control  e 0 ??

so falha nessa situacao. se for esse o caso, atraves da opcao de calculo consegue-se verificar se o 0 e 0 ou 10

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há uns anos li algures que chegaram a pensar usar um X para representar o 10 mas não o fizeram pois, por desconhecimento do seu significado, as pessoas poderiam pensar que se tratava de alguma forma de discriminação, ou algo mais obscuro...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

GRANDE POST!!!

é pá,. eu por acaso tambem é coisa que sempre me enervou (mas é que metia mesmo nervos pá,..até chegava a ter pena das pessoas) era essa história do "Ahh,..isso é o nº de pessoas que teem o mesmo nome que tu!"

HELLO!!!!! Ninguem axa estranho haver sempre entre 0 e 9 pessoas com o mesmo nomeee???

DAHHHH coicidencia do caraças,.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o meu bi  % 11 =  5 !!!

sou ilegal ? ;)

como chegaste á conclusão dos 9 %  ?

outra dúvida.. isso do dígito '0' só podes definir essa situação consoante a forma que eles agrupam os números.. se agruparem de 2 em 2 então tens razão. ex : 14506078

neste caso eles podem agrupar por 14 , 50 , 60 , 78.

ou entao 1 4 5 0 6 0 7 8 , neste caso é um a um e o digito só vai de 0 a 9

não leves isto como uma afirmação mas sim como uma dúvida, porque não sei do que estou a falar, apenas a supor, porque não percebo nada disto e até fiquei interessado ;)

nota: o teu código dáme este erro no Dev c++

11 d:\docume~1\tiagop~1\osmeus~1\exerci~1\teste.cpp

implicit declaration of function `int realloc(...)'  :dontgetit:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

incluiste o digito de control quando fizeste a verificacao ??

divides a populacao portuguesa (100%) por 11 e obtens os ~9% (partindo do pricipio que os nros dos BI's sao sequenciais e o digito de control e um valor calculado)

os digitos sao agrupados 1 a 1.

o digito que pode significar 0 ou 10 e so o de control (o do quadrado)

esse valor pode variar entre 0 e 10 por a divisao ser feita por 11 e nao por 10 (dividindo N por M (divisao de inteiros) o resto e obrigatoriamente um valor entre 0 e M-1)

quanto ao erro de compilacao peco desculpa (neste momento so tenho VC++ instalado). um #include <stdlib.h> deve resolver isso

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim contei com o de verificação e atribui a posição a ele e deume 5 :X

na caixa de verificaçao é possivel aparecer la um 10 ?  weird nunca vi

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aconselho a leitura do fantástico livro:

"o mistério do bilhete de indentidade e outras histórias" de Jorge Buescu.

Já agora aconselho tambem a leitura do segundo livro do mesmo autor cujo nome nao me lembro ( do livro )

Ora bem... está aí um erro!

Não se pode concluir que a percentagem de casos é ~9,09%, esse é um raciocinio inválido. O numero do bi não é atribuido de forma completamente aleatória, é atribuido sequencialmente, entre outras propriedades, os numeros comecados por 1 vão ser mais do que os numeros somecados por exemplo por 2 e por aí fora ( nao exacamente por aí fora... )

Tendo em conta que o algoritmo de verificacao pesa os numeros consoante a sua posicao, entao o 1 vai aparecer mais vezes multiplicado por um do que qualquer outro numero... o que é que eu quero dizer com tudo isto? quero dizer que a distribução probabilistica do resto no final do algoritmo não é plana....

Trocando isto por miudos.. não se pode concluir que é tao provavel obtermos resto 11 como resto 1 por exemplo. Logo, não se pode concluir que este algoritmo falha para 9,09% dos casos. Na verdade falha em menos casos que isso, mas isso acaba por nao ser importante pois este algoritmo nao pode ser usado devido a nao estar bem implementado e não fazer bem aquilo para que foi concebido. Por outras palavras.. em termos praticos actualmente esse numerozinho nao serve para nada.

PS: leiam mesmo os livros... o primeiro exploe e explica este problema, o segundo vai anda mais longe no assunto e apresenta outras hitórias relacionadas com o tema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Versão completa do detalhe :)

Com grande probabilidade o leitor terá já assistido, no meio de um jantar com amigos, à seguinte discussão. A certa altura alguém se pronuncia sobre o algarismo suplementar que os Bilhetes de Identidade passaram a ter de há uns anos para cá mais ou menos nos seguintes termos: "O algarismo suplementar que se segue ao número do BI indica o número de pessoas em Portugal que têm um nome exactamente igual ao do portador do BI".

Quando confrontado com o absurdo de tal afirmação (por exemplo, o algarismo suplementar do meu BI é 9 e eu posso comprovar que sou a única pessoa no Mundo, não apenas em Portugal, com o nome de Jorge Buescu; e que pensar dos casos em que o algarismo é 0?), talvez o interlocutor diga algo do género "Mas eu fui informado por fonte seguríssima de que é assim". Ou talvez prefira mudar de assunto. Uma coisa é certa: não vai mudar de opinião, e na próxima vez em que se falar do assunto lá estará a repetir a mesma afirmação, que depois será eventualmente repetida por novos crentes acríticos e assim sucessivamente. Assistimos assim à geração e propagação oral de uma lenda urbana genuinamente portuguesa, com certeza.

Afinal de contas, o que representa o misterioso algarismo suplementar que se segue ao número do nosso BI? Em primeiro lugar, ele não representa o número de pessoas com o mesmo nome, ou o número de multas de estacionamento que o portador apanhou, ou qualquer outra pueril e disparatada hipótese deste tipo. O algarismo suplementar é (ou seria, se as autoridades portuguesas não tivessem cometido um patético erro matemático!) apenas um algarismo de controle que detecta se o número do BI está correctamente escrito ou não.

Esta história começa nos anos 50, com o nascimento simultâneo, por um lado, da Teoria de Códigos, baseada na Teoria da Informação de Shannon (1948), e por outro da cada vez maior necessidade de tratamento e transmissão em massa de dados de identificação numéricos. Suponha o leitor que é, por exemplo, caixa num supermercado na era pré-leitores ópticos, ou que trabalha numa agência de viagens onde tem de emitir centenas de bilhetes de avião por dia, ou que trabalha numa livraria onde tem de expedir por correio centenas de livros encomendados por dia. Em qualquer destes casos será obrigado a digitar, para cada item em questão (pacote de manteiga, bilhete de avião ou livro) um longo número, talvez com 10 algarismos, que identifica o produto em questão. E tem de o fazer depressa, para que os outros clientes na bicha não se impacientem.

Os seres humanos lidam claramente mal com problemas deste tipo. Escrever diariamente centenas de números com 10 algarismos, sem qualquer padrão aparente, leva inevitavelmente (uma interrupção, uma piada do colega do lado…) a que o operador mais tarde ou mais cedo se engane a escrever um dos números. E as consequências podem ser bastantes desagradáveis: cobrar 20 contos por um pacote de manteiga, emitir um bilhete de avião para a Sibéria em vez de para o Rio, expedir o livro errado. Os custos para corrigir estes erros a posteriori podem, evidentemente, ser muito elevados.

Coloca-se então o seguinte problema: quando se lida sistematicamente com grandes quantidades de números compridos, em que mais tarde ou mais cedo se verificarão erros, há que identificar quais são os erros mais frequentes e encontrar uma forma automática de detectar, assim que o número é escrito, se ele integra erros ou não.

A resposta à primeira pergunta é do domínio da Estatística; sabe-se hoje que mais de 90% dos erros ocorridos na transmissão de dados numéricos são de dois tipos: erros singulares (alteração de um único algarismo, o que levaria por exemplo 2357 a ser escrito como 2358) ou transposições (troca de pares de algarismos adjacentes, como na passagem de 2357 a 2375).

O segundo passo é conceber um algoritmo que detecte, com eficiência 100%, a presença ou ausência destes erros. Se o conseguirmos teremos um mecanismo de detecção de erros com eficiência superior a 90%.

E é aqui que entra a Teoria de Códigos. Existem muitos algoritmos de detecção de erros, com aplicação tecnológica num número infindável de indústrias, assente na ideia básica de aritmética modular, proveniente da Teoria de Números. A ideia é a seguinte: ao número básico em questão acrescenta-se um algarismo suplementar, o algarismo (ou dígito) de controle. Realizando uma operação adequada (e vamos já descrever o que se deve entender por isto) sobre o número original, devemos obter o algarismo de controle. Se isso não acontecer, é porque ocorreu algum erro na escrita do número original.

A ideia de implementar sistemas de identificação com dígitos detectores de erros encontra aplicações quase infindáveis na indústria. É utilizada hoje nos cartões de crédito, nos cheques, na Via Verde, na correspondência postal, nos códigos de barras (UPC-EAN), nos livros (ISBN), nas publicações periódicas (ISSN), etc. Estes sistemas funcionam com variações de pormenor; para dar do seu funcionamento vamos tomar um exemplo: o ISBN (International Standard Book Number), utilizado na identificação de livros.

O ISBN é um número, que em geral aparece nas costas do livro, constituído por 10 algarismos que identificam o livro. Por exemplo, o livro de Hill A first course in coding theory tem o ISBN 0-19-853803-0; o livro de Kato et al. Number Theory I tem o ISBN 0-8218-0863-X (os traços são meramente convencionais). A maneira como o código ISBN funciona é simples: se o número ISBN for

x1x2x3x4x5x6x7x8x9x10,

onde cada xi representa um algarismo, os 9 primeiros algarismos identificam o livro; o 10º algarismo, o dígito de controle, é escolhido por forma a que a soma

x1+2x2+3x3+ … +10x10

seja divisível por 11 (tecnicamente, seja congruente com 0 (mod 11)). O leitor pode convencer-se facilmente de que, se alterar qualquer um dos algarismos (erro singular) ou se trocar dois quaisquer deles (transposição), o resultado já não será divisível por 11. Ou seja, o dígito de controle do ISBN detecta, com eficiência 100%, estes erros!

Apenas duas questões técnicas. Primeiro, porquê exigir que a soma acima seja divisível por 11 e não, por exemplo, por 10? A resposta está na Teoria de Números: estes algoritmos modulares só funcionam se o módulo for um número primo. Ora o nosso sistema de numeração tem base 10; o primo mais próximo de 10 é precisamente 11, o primeiro para o qual o sistema pode funcionar. Esta é também a resposta à segunda questão: o que significa o dígito de controle X? Como o dígito de controle é o complemento para 11 da soma ponderada dos 9 primeiros algarismos, ele pode tomar o valor 10. Para cobrir esta possibilidade introduz-se o caracter X, que tem a valor 10.

Regressemos então ao mistério do BI. Sendo o algarismo suplementar um dígito de controle para detecção de erros, torna-se necessário saber qual o algoritmo utilizado pelo Ministério da Justiça para efectuar esta detecção.

E aqui entra o herói desta história, o Prof. Jorge Picado, da Universidade de Coimbra. A sua curiosidade por esta questão levou-o a pedir os números de BI de algumas dezenas de colegas seus. Introduziu-os num pequeno programa em Pascal que fazia a busca dos vários algortimos num sábado de manhã e foi para casa.

Ao chegar ao seu gabinete, na segunda-feira de manhã, qual não foi o seu espanto ao verificar que… não existia nenhum algoritmo que funcionasse!

Intrigado com este surpreendente resultado, o Prof. Picado teve então uma ideia luminosa. Constatando que o dígito de controle do seu BI era 0, retirou o seu número de BI da lista e pôs o programa a correr. Bingo: em 5 minutos, tinha a resposta. O algoritmo de detecção de erros do Ministério da Justiça é igual ao do ISBN, com ligeiras adaptações: o dígito de controle tem peso 1, o dígito mais à direita do número de BI tem peso 2, o seguinte peso 3, etc. Faça o leitor a experiência com o seu próprio número de BI. Se fizer esta soma o resultado terá de ser múltiplo de 11.

Nesta altura, cerca de 1/11 dos leitores da Ingenium, e cerca de 50% daqueles cujo dígito de controle é 0, estarão a pensar que estou a enganá-los. É que, afinal, fizeram as contas e obtiveram um número que não é divisível por 11. Pelo contrário: é um múltiplo de 11 mais 1! E, afinal, porque é que o Prof. Picado teve de retirar o seu número de BI da lista para descobrir o algoritmo de detecção?

A resposta a estas perguntas é apenas uma, e completamente patética. Como se disse acima, no ISBN (e no BI) o dígito de controle tem de estar entre 0 e 10, para que se possa assegurar resto 0 ao dividir por 11. É essa a razão de ser do caracter alfanumérico X, que vale 10, no dígito de controle do ISBN.

Ora, muito provavelmente alguma mente burocrática da Direcção-Geral dos Registos e Notariado deve ter achado muito desagradável que alguém visse um "X" escrito à frente do seu número de BI, enquanto que outras pessoas tinham apenas um algarismo. Talvez pudesse ser considerado politicamente incorrecto… e a pessoa pudesse pensar que isso teria um significado estranho… talvez cadastro? Ficha no SIS?

Para abreviar: alguém no Ministério da Justiça, na sua reconfortante ignorância matemática sobre códigos, teve a brilhante ideia de substituir o dígito de controle X, quando ocorresse, por 0. Ou seja, quando 0 ocorre como dígito de controle, pode ter na realidade dois valores: 0 ou 10! Ou seja, em metade dos casos em que ocorre o 0 (como no caso do Prof. Picado), esse dígito está errado. Ou seja, o próprio Arquivo de Identificação emite um BI cujo número, se controlado pelo seu algoritmo, estaria errado.

A ignorância pode custar muito caro. Neste caso, custou a inoperância do sistema de detecção de erros que se pretendia implementar! E repare-se que teria sido muito fácil não cometer esta barbaridade: bastava, por exemplo, adoptar como dígito de controle sempre uma letra, digamos as 11 primeiras letras do alfabeto, A a L…

E haveria outras soluções matematicamente correctas, mas mais profundas. O Prof. Picado mostra como, a partir da Teoria de Grupos elementar, usando o grupo diedral D5, se podem construir sistemas de detecção de erros (diferentes dos sistemas modulares, e mesmo melhores do que eles) que permitem usar apenas os algarismos 0 a 9, e com eficiência 100%. Em Novembro passado, o Prof. Picado escreveu para o Ministério da Justiça (responsável pela emissão dos BI) expondo a situação e a sua solução. Até hoje ainda não obteve resposta.

Há pouco tempo, o Prof. Picado foi renovar o seu BI. Na página de instruções do impresso, o ponto 2 afirma "se já tem BI, indique o respectivo nº, incluindo o dígito mais à direita (chamado dígito de controlo e que serve para verificar se a ordem dos algarismos está correcta)". Quando entregou os documentos, disse com toda a razão à funcionária que o atendeu, "Olhe que isto no meu caso não é verdade". A funcionária não disse nada, dirigiu-lhe um olhar estranho, e limitou-se a aceitar os papéis e a atender o mais rapidamente possível aquele utente tão especial…

Retirado de : http://www.mat.uc.pt/~picado/SistIdent/mistBI.html

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

"E repare-se que teria sido muito fácil não cometer esta barbaridade: bastava, por exemplo, adoptar como dígito de controle sempre uma letra, digamos as 11 primeiras letras do alfabeto, A a L…"

realmente,..fogo!!! Quem é que foi o artista que implementou isso ?

Por outras palavras, "Quem é que meteu as patas?" eheh

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ehehe  isso é do meu professor jorge picado!! eheheh ele sabe mto...quando tive conhecimento disto foi por ele...  ele tem  mais coisas sobre  isso...

edit: achei por bem criar 1 topico sobre a discusao de sistemas de controlo ... que inclui este tema do BI...e deixamos este topico para  a discusão do programa em C, aqui apresentado  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

só nao percebi a cena do 0 poder ser 0 ou 10 viste que la so aparece 1 numero:\ alguem me pode xplicar?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

só nao percebi a cena do 0 poder ser 0 ou 10 viste que la so aparece 1 numero:\ alguem me pode xplicar?

Ya.... esse é o problema todo. quando é 10 não devia aparecer 0... devia aparecer outra coisa qq para se distinguir do 0. Mas uns idiotas qq decidiram que só estariam numeros de 0 a 0 nove nesse quadradinho... meteram água e isto agora nao funciona.

ehehe  isso é do meu professor jorge picado!! eheheh ele sabe mto...quando tive conhecimento disto foi por ele...  ele tem  mais coisas sobre  isso...

Não é nao, isto foi trazido a publico pelo Professor do IST Jorge Buesco na revista da ordem dos engenheiros. Depois, algumas das suas crónicas foram editadas nos livros que falei acima.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas qual é a forma de aqueles numero de controle aparecer? como é escolhido o numero ? ninguem tem o algoritmo ?

ou seja aquele numero serve para que todas aquelas contas deem resto 0... se i1*indice +i2*indice e por ai fora %11 = 0 quer dizer que o numero introduzido não está correcto certo ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas qual é a forma de aqueles numero de controle aparecer? como é escolhido o numero ? ninguem tem o algoritmo ?

ou seja aquele numero serve para que todas aquelas contas deem resto 0... se i1*indice +i2*indice e por ai fora %11 = 0 quer dizer que o numero introduzido não está correcto certo ?

Aquele algarismo é o algarismo que terias de colocar no fim do número do bi para que esse numero ( formado pelo numero do BI com o algarismo do quadradinho no fim ) dividido por 11 de resto zero.

por exemplo se o teu numero do BI fosse 16

16%11= 1 com resto =5

entao se puseres um 5 no fim do teu hipotético numero ficarias com

165

que difividodo por 11 dá 15 com resto nulo

5 era o numero que tinha que aparecer dentro do quadradinho :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva pessoal.

Já agora uma nota. Esses algoritmos de checksumming usados no BI e número de contribuinte são baseado no algortimo conhecido como "mod 11". Tb existe o "mod 10" usado em alguns cartões de crédito, etc...

Mas tem a tal "variante" de reduzir os 11 valores possíveis para 10, mapeando dois check-digits num só. O que vocês têm dito aqui (aplicado ao BI) é que os repetidos são o 0 e 10 (=0). No caso do BI não tenho a certeza, mas no caso do número de contribuinte não é assim, os repetidos são o 10 e o 1 (=1) e o mapeamento não é 1:1.

Por outra palavras

CHECKDIGIT_CALCULADO    VALOR_QUE_APARECE_NO_NIF

0      0

1      1

2      9

3      8

4      7

5      6

6      5

7      4

8      3

9      2

10      1

Tenho código velhinho para isto aqui: http://cgd.sdf-eu.org/a/cgb/validfns/valid_nif.c

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora