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.