hermann on Sun, 20 Aug 2023 22:13:01 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Are there lint and/or formatter for PARI/GP?


Thanks,

I had to apt install pari-gp2c first.

Yes, "-G" option outputs rewritten GP, but unlikely useful as a code formatter.

I tried the last GP script I worked with from this new repo:
https://github.com/Hermann-SW/Colbert_numbers/tree/main#readme

I executed gp2c with "-G":

hermann@7600x:~/Colbert_numbers$ gp2c -G validate.gp -o out

hermann@7600x:~/Colbert_numbers$


This is original 9 line GP script:

hermann@7600x:~/Colbert_numbers$ cat validate.gp
\r Colbert.py
assert(b) = { if(!(b), error("assertion failed")); }
print("6 entries of the form [k,n,s,x,y], with p=k*2^n+1, s^2%p==p-1 and p==x^2+y^2");
foreach(C,v,p=v[1]*2^v[2]+1;\
printf("%18s (%d-digit prime)\n",Str(v[1],"*2^",v[2],"+1"),#digits(p));\
  assert(v[3]^2%p==p-1);\
  assert(v[4]^2+v[5]^2==p);\
);
print("done, all asserts OK");
hermann@7600x:~/Colbert_numbers$


gp2c reads in the full 35MB(!) file Colbert.py with t_VEC of t-VEC C and makes it 1st line of output. I will skip that line here for obvious reasons:

hermann@7600x:~/Colbert_numbers$ tail -n+2 out ; echo

assert(b)=
{
  if(!b,error("assertion failed"))
}
print("6 entries of the form [k,n,s,x,y], with p=k*2^n+1, s^2%p==p-1 and p==x^2+y^2"); \
foreach(C,v,p=(v[1]*(2^v[2]))+1; \
printf("%18s (%d-digit prime)\n",Str(v[1],"*2^",v[2],"+1"),length(digits(p))); \
assert(((v[3]^2)%p)==(p-1)); \
assert(((v[4]^2)+(v[5]^2))==p)); \
print("done, all asserts OK")
hermann@7600x:~/Colbert_numbers$


So gp2c -G expands assert 1-line function to 4 lines.
But also removes all indentation that should help to understand.
It adds a space between ";\", so a bit of formatting.

But gp2c -G has a small bug as well:
It removes final semicolon in assert implementation, which results in showing function definition where it should not when executed. But the remainder of the output is OK:

hermann@7600x:~/Colbert_numbers$ gp -q < out
(b)->if(!b,error("assertion failed"))
6 entries of the form [k,n,s,x,y], with p=k*2^n+1, s^2%p==p-1 and p==x^2+y^2
  5359*2^5054502+1 (1521561-digit prime)
 33661*2^7031232+1 (2116617-digit prime)
 28433*2^7830457+1 (2357207-digit prime)
 27653*2^9167433+1 (2759677-digit prime)
19249*2^13018586+1 (3918990-digit prime)
10223*2^31172165+1 (9383761-digit prime)
done, all asserts OK
hermann@7600x:~/Colbert_numbers$


Regards,

Hermann.


On 2023-08-19 22:18, Charles Greathouse wrote:
I think gp2c has an option -G to output GP, which would presumably
handle formatting. I’m not aware of a GP linter.

On Sat, Aug 19, 2023 at 1:05 PM <hermann@stamm-wilbrandt.de> wrote:

I am working with PARI/GP scripts a lot, sometimes because they are
even
faster than C++ with libgmpxx ("halfgcd()" vs. "halfgcdii()"),
mostly
because everything can be done very compact and fast, and because
PariDroid is with me on sartphone on hikes with dog.

For C++ I use cpplint and cppcheck for linting, and they provide
warnings about missing spaces, ... which I modify source manually
until
clean.

For Python I use "pylint", and "black" for formatting (cool
software).

I really would like to lint or format PARI/GP scripts, but
understand if
those are not available.

Regards,

Hermann.