Re: program to verify ISBN numbers (10 digit or 13 digit)

Karim Belabas <[email protected]>
Newsgroups gmane.comp.mathematics.pari.user
Message-ID <[email protected]>
Here's a further shortened version.

verify_isbn(N)=
{ my(M, n, z);
  M = Map([10, [[10,9,8,7,6,5,4,3,2,1]~, 11];
           13, [[1,3,1,3,1,3,1,3,1,3,1,3,1]~, 10]]);
  n = if (type(N)=="t_STR", apply(eval, select(c -> c != "-", Vec(N))),
          type(N)=="t_INT", digits(N));
  if (!mapisdefined(M, #n, &z) || (n * z[1]) % z[2], print("Invalid! ", N)
                                                   , print("Valid ISBN: ", N));
}

Cheers,

    K.B.
-- 
Pr. Karim Belabas, U. Bordeaux, Vice-président en charge du Numérique
Institut de Mathématiques de Bordeaux UMR 5251 - (+33) 05 40 00 29 77
http://www.math.u-bordeaux.fr/~kbelabas/

* Loïc Grenié [2025-01-30 23:15]:
>      Hi,
> 
> On Thu 30 Jan, 2025, at 21:43, American Citizen wrote:
> 
>> Hello All:
>>
>> I had to verify some ISBN numbers and didn't know that they actually
>> followed a well ordered scheme for being checked.
>>
>> For anyone who wants it, here's the GP-Pari program to verify the number
>> or string value (removing the dashes)
>>
>> {verify_isbn(N)=
>> my(m10,m13,m,n,sz,z);
>> m10=[10,9,8,7,6,5,4,3,2,1]~;
>> m13=[1,3,1,3,1,3,1,3,1,3,1,3,1]~;
>> if(type(N)=="t_STR",
>>   m=Vec(N);
>>   sz=matsize(m)[2];
>>   n=0;
>>   for(i=1,sz,if(m[i]!="-",n=concat(n,eval(m[i]));););
>>   sz=matsize(n)[2];
>>   n=vector(sz-1,i,n[i+1]);
>> );
>> if(type(N)=="t_INT", n=digits(N););
>> if(default(debug)>0,print("n=",n));
>> if(matsize(n)[2]==13,
>>   z=n*m13;
>>   if(z%10==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
>>   return;
>> );
>> if(matsize(n)[2]==10,
>>   z=n*m10;
>>   if(z%11==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
>>   return;
>> );
>> print("Invalid ISBN: ",N);
>> }
>>
> 
>      I have slightly streamlined it. It is possible to make it shorter,
>   I have not pushed in that direction.
> 
>          Cheers,
> 
>             Loïc
> 
> verify_isbn(N)=
> {
>     my(m10,m13,n,z);
> 
>     m10=[10,9,8,7,6,5,4,3,2,1]~;
>     m13=[1,3,1,3,1,3,1,3,1,3,1,3,1]~;
> 
>     if(type(N)=="t_STR",
>         n=apply(eval,select(c->c!="-",Vec(N)));
>     ,
>         type(N)=="t_INT",
>         n=digits(N);
>     );
>     if(default(debug)>0,print("n=",n));
>     if(#n==13,
>         z=n*m13;
>         if(z%10==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
>     ,
>         #n==10,
>         z=n*m10;
>         if(z%11==0,print("Valid ISBN: ",N);,print("Invalid! ",N););
>     ,
>         print("Invalid ISBN: ",N);
>     );
> }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.