Fórmula de Luhn

De la Viquipèdia, l'enciclopèdia lliure.
Saltar a la navegació Saltar a la cerca

La fórmula de Luhn , també coneguda com a Mòdul 10 , és un algorisme senzill que permet generar i verificar la validesa de diversos números d’identificació. Va ser inventat el 1954 per l' informàtic d'IBM Hans Peter Luhn i patentat el 1960. [1] Ara en el domini públic té múltiples aplicacions, per exemple per als números de les targetes de crèdit .

Cada targeta de crèdit té el seu propi número de targeta (per exemple, 0000-1234-5678-9123) on la primera part identifica el circuit internacional ( Visa , American Express , Mastercard ...) mentre que la resta el banc emissor i el client.

Descripció de l'algorisme per al càlcul de la figura de Luhn

El dígit de comprovació del tipus Luhn es calcula d’una manera senzilla. S'afegeixen tots els dígits de la posició igual al doble de la suma dels que es troben en posició senar. Per tant, considerem el mòdul respecte a 10 (és a dir, la resta de la divisió per 10) del valor així obtingut; la figura de Luhn es determina de la següent manera:

  • si el mòdul és 0 (la suma és divisible per 10), el dígit de comprovació serà 0. Per exemple, si la suma = 60 dividida per 10 dóna la resta 0, el dígit de Luhn serà 0
  • en cas contrari, la figura de Luhn serà la diferència entre 10 i el mòdul. Per exemple, si la suma = 61 que divideix per 10 dóna la resta 1, la xifra de Luhn serà 9 (10-1)

Verificació del número

La comprovació d’un número que conté el dígit de Luhn es basa en tres passos:

  1. Començant per la dreta i desplaçant-vos cap a l’esquerra, multipliqueu cada dígit col·locat uniformement per 2
  2. Quan la multiplicació ha donat un resultat de dues xifres, afegiu-ne els dos per obtenir-ne només un (per exemple, 18 = 1 + 8)
  3. Sumeu tots els dígits, tant en posició parell com en posició senar

Si la suma total és divisible per 10 (la divisió no té resta), la targeta és vàlida.

Per exemple, suposant que teniu el número de targeta següent: 4716-4359-1733-0099 (per tant, 9900367291386278)

  1. 9 + 9 + 0 + 0 + 3 + 6 + 7 + 2 + 9 + 1 + 3 + 8 + 6 + 2 + 7 + 8 = 80
  2. 80/10 = 8 = resultat sencer → targeta vàlida

El número d'assegurança social utilitza la fórmula de Luhn al Canadà per identificar els seus clients; no obstant això, amb la següent fórmula no comprova informació addicional, com ara el nombre de dígits i la validesa de la data de caducitat. Al cap i a la fi, la fórmula ha estat dissenyada per detectar errors de mecanografia, no és adequada per detectar falsificacions voluntàries.

Algorisme en C ++

La funció presentada aquí a C ++ no està pensada per ser optimitzada tant com per ser clara. A més de possibles optimitzacions, una funció més completa podria, per exemple, verificar que la cadena passada a l’entrada només conté dígits decimals. Els comentaris i els noms de variables el més autodescriptibles possibles haurien de deixar clar el funcionament de l'algorisme.

 / **
* La següent funció C ++ calcula i retorna el dígit de comprovació segons la fórmula de Luhn.
* Pren com a paràmetre una cadena numèrica decimal, òbviament sense el dígit de comprovació.
* /
int computeLuhnControlDigit ( cadena numèrica )
{
    int sum = 0 , currentDigit , toSum , doubledDigit ;
    
    if ( cadena numèrica . length () % 2 ! = 0 )
	    cadena numèrica = "0" + cadena numèrica ; // afegiu un 0 si el nombre de dígits és senar
    
    for ( int i = 0 ; i < cadena numèrica . length (); i ++ )
    {
        digitCurrent = atoi ( cadena numèrica . substr ( cadena numèrica . longitud () - i , 1 ). c_str ()); // converteix el caràcter actual a int
        si (( i % 2 ) ! = 0 ) // els dígits senars es doblen
        {
            DoubleDigit = CurrentDigit * 2 ;
            si ( doble dígit > = 10 )
                add = 1 + ( doble dígit % 10 ); // afegiu els dígits si el número és> 10
            en cas contrari
                daSumare = doble dígit ;
        }
        else // els dígits parells s’afegeixen tal com són
            daSumare = CurrentDigit ;

        suma + = a afegir ; // actualització del resultat parcial
    }
    if ( suma % 10 == 0 ) // si la suma és divisible per 10, retorna 0
        retorn 0 ;
    en cas contrari
        retorn 10 - ( suma % 10 ); // en cas contrari, torneu 10: el mòdul 10 de la suma
}

Algorisme en VBA per a Excel 2007

 Funció LUHN ( cadena numèrica com a cadena ) com a enter

    'Aquesta funció calcula i retorna el dígit de comprovació segons la fórmula de Luhn

    'rebent a l'entrada una cadena numèrica decimal, sense el número de control.

    Dim sum As Integer , digitCurrent As Integer , daSumare As Integer , digitDouble As Integer
    suma = 0
    Si (( Len ( cadena numèrica ) Mod 2 ) <> 0 ) Aleshores
        cadena numèrica = "0" + cadena numèrica
    Finalitza If
    Per a i = 1 a Len ( cadena numèrica )
        digitCurrent = cint (Mid (cadena numèrica, Len (cadena numèrica) + 1 - I, 1))
        Si ( i Mod 2 ) <> 0 Aleshores                
            DoubleDigit = CurrentDigit * 2
            Si Doble dígit > = 10 Aleshores
                daSommare = 1 + ( dígit duplicat Mod 10 ) 'afegeix els dígits si el número és> 10
            Altrament
                afegir = doble dígit
            Finalitza If
        Altrament  
            add = dígit actual
        Finalitza If
        suma = suma + a afegir  
      Pròxim
    Si ( suma Mod 10 ) = 0 Llavors   
        LUHN = 0
    Altrament
        LUHN = 10 - ( suma Mod 10 ) 
    Finalitza If
Funció final

Nota

Matemàtiques Portal de matemàtiques : accediu a les entrades de Wikipedia relacionades amb les matemàtiques