mdiv(a
,b
,q
,r
) MINT
*a
,*b
,*q
,*r
;
if(x
.len
<0) {sign
= -1; x
.len
= -x
.len
;}
if(y
.len
<0) {sign
= -sign
; y
.len
= -y
.len
;}
m_dsb(q
,n
,a
,b
) short *a
,*b
;
if(x
>>15 ==0) { return(0);}
else d
=(u1
*0100000L+u2
)/v1
;
{ x1
=u1
*0100000L+u2
-v1
*d
;
m_div(a
,b
,q
,r
) MINT
*a
,*b
,*q
,*r
;
u
.len
=v
.len
=x
.len
=w
.len
=0;
if(b
->len
==0) { fatal("mdiv divide by zero"); return;}
{ r
->val
=xalloc(1,"m_div1");
sdiv(a
,b
->val
[0],q
,r
->val
);
r
->val
=xalloc(r
->len
,"m_div2");
for(qq
=0;qq
<r
->len
;qq
++) r
->val
[qq
]=a
->val
[qq
];
d
=0100000L/(b
->val
[n
-1]+1L);
mult(a
,&x
,&u
); /*subtle: relies on fact that mult allocates extra space */
qval
=xalloc(a
->len
-n
+1,"m_div3");
{ qq
=m_trq(v1
,v2
,u
.val
[j
+n
],u
.val
[j
+n
-1],u
.val
[j
+n
-2]);
if(m_dsb(qq
,n
,v
.val
,&(u
.val
[j
]))) qq
-= 1;
sdiv(&x
,d
,&w
,(short *)&qq
);
if(qq
>0 && qval
[qq
-1]==0) qq
-= 1;