Ой, что-то я накосячил. Предыдущее сообщение недействительно.
-- 27.05.2023, 15:24 --Попытка номер 2.
Функция
sqn() вычисляет количество представлений входного числа суммой двух натуральных квадратов
Код:
sqn(c)=my(v=factor(c),a0=if(v[1,1]==2,v[1,2],0),v1=v,b=1;b4=0);for(i=1,#v[,1],b4=v[i,1]%4;if(b4==1,b=b*(v[i,2]+1));if(b4==3,if(v[i,2]%2!=0,return(0))));if(b%2==0,return(b/2));return((b-(-1)^a0)/2)
Функция
sqw() обращается к функции
sqn(), затем перебирает и печатает решения пока не найдёт их все.
Код:
sqw(n)=my(x,y,c=sqn(n),c0=0);if(c==0,print("No solutions");return());print(c," solutions:");for(x=1,sqrt(n/2), if(issquare(n-x^2,&y), print(n,"=",x,"^2+",y,"^2");c0++;if(c0==c,return())));
Надеюсь, косяков нет
Ускорение за счет:
1. Ускоряется если решений нет.
2. Перебор заканчивается когда найдены все решения.
P.S. Я не силён в
while и
until, так что заколхозил просто выход из
forP.P.S. Идея как считать количество решений взята отсюда:
https://mathworld.wolfram.com/SumofSquaresFunction.html