Using Bhaskara's Chakravala method for solving   x 2 = d y 2 + 1

Note that we have  mixed strategies. In its current form, nres uses the true minimum value  for the improving (m,1,dnorm())

while originally we kept m 2  less than d. This results in shortening.

Explanation of functions:

dnorm(x,d) : calculates the norm of x = [x[1], x[2]]  for the modulus d.

bhav(x,y,d): calculates the bhavana (product in our field) of x,y with modulus d.

mbh(list,d): multi-bhavana on a list.

res( [x[1], x[2], x[3]] ) solves x[1]+x[2]*t = `mod`(0,x[3]) .

nres( [x[1], x[2], x[3]] ,d) solves as above and reports an answer an optimal answer - the one with smallest norm with modulus d.

The answer is a triple [a,1,c] where c is the dnorm of (a,1).

improve(u,d) uses the nres and combines u with the optimal solution. d is the modulus.

imp(u,d) same as improve, except it skips the multiplication (bhavana). Answer is a new triple with the leftover part of the dnorm at the end.

red(u,a,d) factors out a from u and reports a triple [u[1]/a, u[2]/a, c]  where c is the new dnorm.

dolist(list,d) keeps on extending the list by improving and reducing the last created (actually the first) term!

dolis is the same, except uses imp and hence leaves the parts unmultiplied.

build(list,d) Finishes the multiplications postponed in dolis.

>   

Functions

>    dnorm:=(x,d)->x[1]^2-d*x[2]^2:# norm w.r.t. d

>    bhav:=proc(x,y,d) local ans,tmpx,tmpy,var,tmp;
#Bhavana of Brahmagupta-Bhaskara
tmpx:=x[1]+var*x[2];tmpy:=y[1]+var*y[2];
tmp:=expand(tmpx*tmpy);tmp:=subs(var^2=d,tmp);
ans:=[coeff(tmp,var,0),coeff(tmp,var,1)];
ans:=[op(ans),dnorm(ans,d)];end:

>    mbh:=proc(lis,d) local ans,i;#multiple bhavana
ans:=lis[1];
for i from 2 to nops(lis) do;
ans:=bhav(ans,lis[i],MD);
od;
ans; end:

>    res:=proc(u) local ans,x;#resolution for a suitable unitary sol.
ans:=msolve(u[1]+u[2]*x,abs(u[3]));
end:

>    nres:=proc(u,d) local tmp,ans,x,a1,a2;# Same as res, except the answer is a triple.
tmp:=msolve(u[1]+u[2]*x,abs(u[3]));
ans:=subs(tmp,x);while ans^2<d do;  #print(ans);
ans:=ans+abs(u[3]);
od;
a2:=abs(ans^2-d);a1:=abs((ans-abs(u[3]))^2-d);  #print(ans,a1,a2);
if a1<=a2 then ans:=ans-abs(u[3]);fi;
#print([ans,1,dnorm([ans,1],d)]);
[ans,1,dnorm([ans,1],d)];
end:

>    improve:=(u,d)->bhav(u,nres(u,d),d): #combines u with its resolution.
imp:=proc(u,d) local tmp,ans;
tmp:=nres(u,d);
print(tmp[3],u[3]);ans:=[tmp[1],tmp[2],tmp[3]/u[3]]:end:

>    red:=proc(u,a,d) local ans;   #Factors out a from u
ans:=[u[1]/a,u[2]/a];
ans:=[op(ans),dnorm(ans,d)];end:

>    dolist:=proc(l,d) local lis,tmp; # shortcut to improvement in a list!
lis:=l;
#nres(lis[1],d);
tmp:=improve(lis[1],d);
tmp:=red(tmp,abs(lis[1][3]),d);lis:=[%,op(lis)];
end:
##
dolis:=proc(l,d) local lis,tmp; # shortcut to improvement in a list!
lis:=l;
#nres(lis[1],d);
tmp:=imp(lis[1],d);
lis:=[tmp,op(lis)];
end:
##
build:=proc(lis,MD) local tmp,ans,i,n;
n:=nops(lis);
tmp:=[seq([lis[i][1],lis[i][2]],i=1..n)]:print(tmp):
tmp:=mbh(tmp,MD);
ans:=red(tmp,product(lis[i][3],i=1..n),MD);end:

>    ;

>    dolis([[10,1,-3]],103);

18 , -3

11 1 -6 10 1 -3

>    dolist(%,103);

30 3 -27 11 1 -6 10 1 -3

The above is now exclusively used in the worksheet!

>    red([27,6,45],3,19);

9 2 5

>    nres([4,1,-3],19);

5 1 6

Case of 11

>    MD:=11;l11:=[[3,1,dnorm([3,1],11)]];

MD := 11

l11 := 3 1 -2

>    dolis(l11,MD);

-2 , -2

3 1 1 3 1 -2

>    build(%,MD);

3 1 3 1

-10 -3 1

>   

>   

Case of  17

>    MD:=17;

MD := 17

>    l17:=[[4,1,dnorm([4,1],MD)]];

l17 := 4 1 -1

Case of 19

>    MD:=19; #modulus is set to 19

MD := 19

>    l19:=[[4,1,dnorm([4,1],MD)]];

l19 := 4 1 -3

>    dolis(l19,MD);

6 , -3

5 1 -2 4 1 -3

>    dolis(%,MD);

6 , -2

5 1 -3 5 1 -2 4 1 -3

>    dolis(%,MD);

-3 , -3

4 1 1 5 1 -3 5 1 -2 4 1 -3

>    build(%,MD);

4 1 5 1 5 1 4 1

-170 -39 1

>   

>   

Case of 43

>    MD:=43;

MD := 43

>    l43:=[[7,1,dnorm([7,1],MD)]];

l43 := 7 1 6

>    dolist(%,MD);

13 2 -3 7 1 6

>    dolist(%,MD);

59 9 -2 13 2 -3 7 1 6

>    dolist(%,MD);

400 61 -3 59 9 -2 13 2 -3 7 1 6

>    dolist(%,MD);

1541 235 6 400 61 -3 59 9 -2 13 2 -3 7 1 6

>    dolist(%,MD);

3482 531 1 1541 235 6 400 61 -3 59 9 -2 13 2 -3 7 1 6

>    bhav([59,9],[7,1],MD);red(%,2,MD);

800 122 -12

400 61 -3

>    bhav([400,61],[5,1],MD);red(%,3,MD);

4623 705 54

1541 235 6

>    bhav([1541,235],[7,1],MD);red(%,6,MD);

20892 3186 36

3482 531 1

>    dnorm([3482,531],MD);

1

>   

>    dolis(l43,MD);

-18 , 6

5 1 -3 7 1 6

>    dolis(%,MD);

6 , -3

7 1 -2 5 1 -3 7 1 6

>    dolis(%,MD);

6 , -2

7 1 -3 7 1 -2 5 1 -3 7 1 6

>    dolis(%,MD);

-18 , -3

5 1 6 7 1 -3 7 1 -2 5 1 -3 7 1 6

>    dolis(%,MD);

6 , 6

7 1 1 5 1 6 7 1 -3 7 1 -2 5 1 -3 7 1 6

>   

>   

>   

Case of 47

>    MD:=47: #Modulus is 47;

>    lis47:=[[7,1,dnorm([7,1],MD)]];

lis47 := 7 1 2

>    dolis(%,MD);

2 , 2

7 1 1 7 1 2

>    build(%,MD);

7 1 7 1

48 7 1

>   

>   

Case of 57

>    MD:=57:# Modulus=57

>    lis57:=[[8,1,dnorm([8,1],MD)]];

lis57 := 8 1 7

>    dolis(%,MD);

-21 , 7

6 1 -3 8 1 7

>    dolis(%,MD);

-21 , -3

6 1 7 6 1 -3 8 1 7

>    dolis(%,MD);

7 , 7

8 1 1 6 1 7 6 1 -3 8 1 7

>    build(%,MD);

8 1 6 1 6 1 8 1

-151 -20 1

>   

>   

>   

>   

>   

Case of 58

>    MD:=58; #modulus is set to 58

>    u1:=[8,1];dnorm(u1,MD);

MD := 58

u1 := 8 1

6

>    l58:=[[op(u1),dnorm(u1,MD)]];

l58 := 8 1 6

>    dolis(l58,MD);

-42 , 6

4 1 -7 8 1 6

>    dolis(%,MD);

42 , -7

10 1 -6 4 1 -7 8 1 6

>    dolis(%,MD);

6 , -6

8 1 -1 10 1 -6 4 1 -7 8 1 6

>    build(%,MD);

8 1 10 1 4 1 8 1

-99 -13 -1

>    bhav([99,13],[99,13],MD);

19603 2574 1

>   

Case of  67

>   

>    MD:=67;

MD := 67

Using dolist

>    l67:=[[8,1,dnorm([8,1],MD)]];

l67 := 8 1 -3

>    dolis(%,MD);

-18 , -3

7 1 6 8 1 -3

>    dolis(%,MD);

-42 , 6

5 1 -7 7 1 6 8 1 -3

>    dolis(%,MD);

14 , -7

9 1 -2 5 1 -7 7 1 6 8 1 -3

>    dolis(%,MD);

14 , -2

9 1 -7 9 1 -2 5 1 -7 7 1 6 8 1 -3

>    dolis(%,MD);

-42 , -7

5 1 6 9 1 -7 9 1 -2 5 1 -7 7 1 6 8 1 -3

>    dolis(%,MD);

-18 , 6

7 1 -3 5 1 6 9 1 -7 9 1 -2 5 1 -7 7 1 6 8 1 -3

>    dolis(%,MD);

-3 , -3

8 1 1 7 1 -3 5 1 6 9 1 -7 9 1 -2 5 1 -7 7 1 6 8 1 -3

>    build(%,MD);

8 1 7 1 5 1 9 1 9 1 5 1 7 1 8 1

-48842 -5967 1

>   

>   

>   

>   

Short cut possible!

>    bhav([221,27],[221,27],MD);

97684 11934 4

>    red(%,2,MD);

48842 5967 1

>   

Case of 61

>    MD:=61;

MD := 61

>    l61:=[[8,1,dnorm([8,1],MD)]];

l61 := 8 1 3

>    dolis(%,MD);

-12 , 3

7 1 -4 8 1 3

>    dolis(%,MD);

20 , -4

9 1 -5 7 1 -4 8 1 3

>    dolis(%,MD);

-25 , -5

6 1 5 9 1 -5 7 1 -4 8 1 3

>    dolis(%,MD);

20 , 5

9 1 4 6 1 5 9 1 -5 7 1 -4 8 1 3

>    dolis(%,MD);

-12 , 4

7 1 -3 9 1 4 6 1 5 9 1 -5 7 1 -4 8 1 3

>    dolis(%,MD);

3 , -3

8 1 -1 7 1 -3 9 1 4 6 1 5 9 1 -5 7 1 -4 8 1 3

>    build(%,MD);

8 1 7 1 9 1 6 1 9 1 7 1 8 1

29718 3805 -1

>   

>   

>   

Shortcut!

>    bhav([39,5],[39^2+2,39*5],MD);

118872 15220 -16

>    red(%,4,MD);

29718 3805 -1

>   

Case of 92

>    MD:=92;

MD := 92

>    l92:=[[9,1,dnorm([9,1],MD)]];

l92 := 9 1 -11

Using dolist

>    dolis(l92,92);

77 , -11

13 1 -7 9 1 -11

>    dolis(%,92);

-28 , -7

8 1 4 13 1 -7 9 1 -11

>    dolis(%,92);

-28 , 4

8 1 -7 8 1 4 13 1 -7 9 1 -11

>    dolis(%,92);

-56 , -7

6 1 8 8 1 -7 8 1 4 13 1 -7 9 1 -11

>    dolis(%,92);

8 , 8

10 1 1 6 1 8 8 1 -7 8 1 4 13 1 -7 9 1 -11

>    build(%,MD);

10 1 6 1 8 1 8 1 13 1 9 1

-1151 -120 1

>   

>   

>   

Of course, now the process stops, since norm becomes 1.

Shortcut possible

Alternate treatment using 4.

>    bhav([48,5],[48,5],92);

4604 480 16

>    red(%,4,92);

1151 120 1

>   

Case of 88

>    MD:=88;

MD := 88

>    l88:=[[9,1,dnorm([9,1],MD)]];

l88 := 9 1 -7

>    dolis(%,MD);

56 , -7

12 1 -8 9 1 -7

>    dolis(%,MD);

56 , -8

12 1 -7 12 1 -8 9 1 -7

>    dolis(%,MD);

-7 , -7

9 1 1 12 1 -7 12 1 -8 9 1 -7

>    build(%,MD);

9 1 12 1 12 1 9 1

-197 -21 1

>   

Case of 97

>    MD:=97;

MD := 97

>    l97:=[[10,1,dnorm([10,1],MD)]];

l97 := 10 1 3

>    dolis(%,MD);

24 , 3

11 1 8 10 1 3

>    dolis(%,MD);

-72 , 8

5 1 -9 11 1 8 10 1 3

>    dolis(%,MD);

72 , -9

13 1 -8 5 1 -9 11 1 8 10 1 3

>    dolis(%,MD);

24 , -8

11 1 -3 13 1 -8 5 1 -9 11 1 8 10 1 3

>    dolis(%,MD);

3 , -3

10 1 -1 11 1 -3 13 1 -8 5 1 -9 11 1 8 10 1 3

>    build(%,MD);

10 1 11 1 13 1 5 1 11 1 10 1

5604 569 -1

>   

Case of 103

>    MD:=103;

MD := 103

Using dolist

>    l103:=[[10,1,dnorm([10,1],MD)]];

l103 := 10 1 -3

>    dolis(%,MD);

18 , -3

11 1 -6 10 1 -3

>    dolis(%,MD);

-54 , -6

7 1 9 11 1 -6 10 1 -3

>    dolis(%,MD);

18 , 9

11 1 2 7 1 9 11 1 -6 10 1 -3

>    dolis(%,MD);

18 , 2

11 1 9 11 1 2 7 1 9 11 1 -6 10 1 -3

>    dolis(%,MD);

-54 , 9

7 1 -6 11 1 9 11 1 2 7 1 9 11 1 -6 10 1 -3

>    dolis(%,MD);

18 , -6

11 1 -3 7 1 -6 11 1 9 11 1 2 7 1 9 11 1 -6 10 1 -3

>    dolis(%,MD);

-3 , -3

10 1 1 11 1 -3 7 1 -6 11 1 9 11 1 2 7 1 9 11 1 -6 10 1 -3

>    w:=mbh([[10,1],[11,1],[7,1],[11,1]],MD);

w := 77274 7614 52488

>    red(%,sqrt(%[3]),MD);

477 2 2 47 2 2 1

>    bhav(%,%,MD);

227528 22419 1

>    ifactor(w[3]);

2 3 3 8

 We could also have cut it short by using the norm 2.

>    dnorm([477,47],MD);

2

>    bhav([477,47],[477,47],MD);

455056 44838 4

>    red(%,2,MD);

227528 22419 1

Case of 107

>    MD:=107;

MD := 107

>    l107:=[[10,1,dnorm([10,1],MD)]];

l107 := 10 1 -7

>    dolis(%,MD);

14 , -7

11 1 -2 10 1 -7

>    dolis(%,MD);

14 , -2

11 1 -7 11 1 -2 10 1 -7

>    dolis(%,MD);

-7 , -7

10 1 1 11 1 -7 11 1 -2 10 1 -7

>    build(%,MD);

10 1 11 1 11 1 10 1

-962 -93 1

>    bhav([31,3],[31,3],MD);

1924 186 4

>    red(%,2,MD);

962 93 1

Case of 433

>    MD:=433;

MD := 433

>    l433:=[[21,1,dnorm([21,1],MD)]];

l433 := 21 1 8

>    dolis(%,MD);

-72 , 8

19 1 -9 21 1 8

>    dolis(%,MD);

-144 , -9

17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

-208 , 16

15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

143 , -13

24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

-33 , -11

20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

51 , 3

22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

-289 , 17

12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

51 , -17

22 1 -3 12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

-33 , -3

20 1 11 22 1 -3 12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

143 , 11

24 1 13 20 1 11 22 1 -3 12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

-208 , 13

15 1 -16 24 1 13 20 1 11 22 1 -3 12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

-144 , -16

17 1 9 15 1 -16 24 1 13 20 1 11 22 1 -3 12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

-72 , 9

19 1 -8 17 1 9 15 1 -16 24 1 13 20 1 11 22 1 -3 12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    dolis(%,MD);

8 , -8

21 1 -1 19 1 -8 17 1 9 15 1 -16 24 1 13 20 1 11 22 1 -3 12 1 -17 22 1 17 20 1 3 24 1 -11 15 1 -13 17 1 16 19 1 -9 21 1 8

>    build(%,MD);

21 1 19 1 17 1 15 1 24 1 20 1 22 1 12 1 22 1 20 1 24 1 15 1 17 1 19 1 21 1

7230660684 347483377 -1

>    with(numtheory):

>    cfrac(sqrt(403),'periodic');;

20 + 1 13 + 1 2 + 1 1 + 1 3 + 1 1 + 1 3 + 1 1 + 1 2 + 1 13 + 1 40 + 1 13 + 1 2 + 1 1 + 1 3 + 1 1 + 1 3 + 1 1 + 1 2 + 1 13 + 1 40 + ...

>    periodic;

periodic

>    ?cfrac

>