1*5a6e8488SAndroid Build Coastguard Worker/* 2*5a6e8488SAndroid Build Coastguard Worker * ***************************************************************************** 3*5a6e8488SAndroid Build Coastguard Worker * 4*5a6e8488SAndroid Build Coastguard Worker * SPDX-License-Identifier: BSD-2-Clause 5*5a6e8488SAndroid Build Coastguard Worker * 6*5a6e8488SAndroid Build Coastguard Worker * Copyright (c) 2018-2024 Gavin D. Howard and contributors. 7*5a6e8488SAndroid Build Coastguard Worker * 8*5a6e8488SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 9*5a6e8488SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 10*5a6e8488SAndroid Build Coastguard Worker * 11*5a6e8488SAndroid Build Coastguard Worker * * Redistributions of source code must retain the above copyright notice, this 12*5a6e8488SAndroid Build Coastguard Worker * list of conditions and the following disclaimer. 13*5a6e8488SAndroid Build Coastguard Worker * 14*5a6e8488SAndroid Build Coastguard Worker * * Redistributions in binary form must reproduce the above copyright notice, 15*5a6e8488SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 16*5a6e8488SAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 17*5a6e8488SAndroid Build Coastguard Worker * 18*5a6e8488SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*5a6e8488SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*5a6e8488SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*5a6e8488SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*5a6e8488SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*5a6e8488SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*5a6e8488SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*5a6e8488SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*5a6e8488SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*5a6e8488SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*5a6e8488SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 29*5a6e8488SAndroid Build Coastguard Worker * 30*5a6e8488SAndroid Build Coastguard Worker * ***************************************************************************** 31*5a6e8488SAndroid Build Coastguard Worker * 32*5a6e8488SAndroid Build Coastguard Worker * The second bc math library. 33*5a6e8488SAndroid Build Coastguard Worker * 34*5a6e8488SAndroid Build Coastguard Worker */ 35*5a6e8488SAndroid Build Coastguard Worker 36*5a6e8488SAndroid Build Coastguard Workerdefine p(x,y){ 37*5a6e8488SAndroid Build Coastguard Worker auto a,i,s,z 38*5a6e8488SAndroid Build Coastguard Worker if(y==0)return 1@scale 39*5a6e8488SAndroid Build Coastguard Worker if(x==0){ 40*5a6e8488SAndroid Build Coastguard Worker if(y>0)return 0 41*5a6e8488SAndroid Build Coastguard Worker return 1/0 42*5a6e8488SAndroid Build Coastguard Worker } 43*5a6e8488SAndroid Build Coastguard Worker a=y$ 44*5a6e8488SAndroid Build Coastguard Worker if(y==a)return(x^a)@scale 45*5a6e8488SAndroid Build Coastguard Worker z=0 46*5a6e8488SAndroid Build Coastguard Worker if(x<1){ 47*5a6e8488SAndroid Build Coastguard Worker y=-y 48*5a6e8488SAndroid Build Coastguard Worker a=-a 49*5a6e8488SAndroid Build Coastguard Worker z=x 50*5a6e8488SAndroid Build Coastguard Worker x=1/x 51*5a6e8488SAndroid Build Coastguard Worker } 52*5a6e8488SAndroid Build Coastguard Worker if(y<0){ 53*5a6e8488SAndroid Build Coastguard Worker return e(y*l(x)) 54*5a6e8488SAndroid Build Coastguard Worker } 55*5a6e8488SAndroid Build Coastguard Worker i=x^a 56*5a6e8488SAndroid Build Coastguard Worker s=scale 57*5a6e8488SAndroid Build Coastguard Worker scale+=length(i)+5 58*5a6e8488SAndroid Build Coastguard Worker if(z){ 59*5a6e8488SAndroid Build Coastguard Worker x=1/z 60*5a6e8488SAndroid Build Coastguard Worker i=x^a 61*5a6e8488SAndroid Build Coastguard Worker } 62*5a6e8488SAndroid Build Coastguard Worker i*=e((y-a)*l(x)) 63*5a6e8488SAndroid Build Coastguard Worker scale=s 64*5a6e8488SAndroid Build Coastguard Worker return i@scale 65*5a6e8488SAndroid Build Coastguard Worker} 66*5a6e8488SAndroid Build Coastguard Workerdefine r(x,p){ 67*5a6e8488SAndroid Build Coastguard Worker auto t,n 68*5a6e8488SAndroid Build Coastguard Worker if(x==0)return x 69*5a6e8488SAndroid Build Coastguard Worker p=abs(p)$ 70*5a6e8488SAndroid Build Coastguard Worker n=(x<0) 71*5a6e8488SAndroid Build Coastguard Worker x=abs(x) 72*5a6e8488SAndroid Build Coastguard Worker t=x@p 73*5a6e8488SAndroid Build Coastguard Worker if(p<scale(x)&&x-t>=5>>p+1)t+=1>>p 74*5a6e8488SAndroid Build Coastguard Worker if(n)t=-t 75*5a6e8488SAndroid Build Coastguard Worker return t 76*5a6e8488SAndroid Build Coastguard Worker} 77*5a6e8488SAndroid Build Coastguard Workerdefine ceil(x,p){ 78*5a6e8488SAndroid Build Coastguard Worker auto t,n 79*5a6e8488SAndroid Build Coastguard Worker if(x==0)return x 80*5a6e8488SAndroid Build Coastguard Worker p=abs(p)$ 81*5a6e8488SAndroid Build Coastguard Worker n=(x<0) 82*5a6e8488SAndroid Build Coastguard Worker x=abs(x) 83*5a6e8488SAndroid Build Coastguard Worker t=(x+((x@p<x)>>p))@p 84*5a6e8488SAndroid Build Coastguard Worker if(n)t=-t 85*5a6e8488SAndroid Build Coastguard Worker return t 86*5a6e8488SAndroid Build Coastguard Worker} 87*5a6e8488SAndroid Build Coastguard Workerdefine f(n){ 88*5a6e8488SAndroid Build Coastguard Worker auto r 89*5a6e8488SAndroid Build Coastguard Worker n=abs(n)$ 90*5a6e8488SAndroid Build Coastguard Worker for(r=1;n>1;--n)r*=n 91*5a6e8488SAndroid Build Coastguard Worker return r 92*5a6e8488SAndroid Build Coastguard Worker} 93*5a6e8488SAndroid Build Coastguard Workerdefine max(a,b){ 94*5a6e8488SAndroid Build Coastguard Worker if(a>b)return a 95*5a6e8488SAndroid Build Coastguard Worker return b 96*5a6e8488SAndroid Build Coastguard Worker} 97*5a6e8488SAndroid Build Coastguard Workerdefine min(a,b){ 98*5a6e8488SAndroid Build Coastguard Worker if(a<b)return a 99*5a6e8488SAndroid Build Coastguard Worker return b 100*5a6e8488SAndroid Build Coastguard Worker} 101*5a6e8488SAndroid Build Coastguard Workerdefine perm(n,k){ 102*5a6e8488SAndroid Build Coastguard Worker auto f,g,s 103*5a6e8488SAndroid Build Coastguard Worker if(k>n)return 0 104*5a6e8488SAndroid Build Coastguard Worker n=abs(n)$ 105*5a6e8488SAndroid Build Coastguard Worker k=abs(k)$ 106*5a6e8488SAndroid Build Coastguard Worker f=f(n) 107*5a6e8488SAndroid Build Coastguard Worker g=f(n-k) 108*5a6e8488SAndroid Build Coastguard Worker s=scale 109*5a6e8488SAndroid Build Coastguard Worker scale=0 110*5a6e8488SAndroid Build Coastguard Worker f/=g 111*5a6e8488SAndroid Build Coastguard Worker scale=s 112*5a6e8488SAndroid Build Coastguard Worker return f 113*5a6e8488SAndroid Build Coastguard Worker} 114*5a6e8488SAndroid Build Coastguard Workerdefine comb(n,r){ 115*5a6e8488SAndroid Build Coastguard Worker auto s,f,g,h 116*5a6e8488SAndroid Build Coastguard Worker if(r>n)return 0 117*5a6e8488SAndroid Build Coastguard Worker n=abs(n)$ 118*5a6e8488SAndroid Build Coastguard Worker r=abs(r)$ 119*5a6e8488SAndroid Build Coastguard Worker s=scale 120*5a6e8488SAndroid Build Coastguard Worker scale=0 121*5a6e8488SAndroid Build Coastguard Worker f=f(n) 122*5a6e8488SAndroid Build Coastguard Worker h=f(r) 123*5a6e8488SAndroid Build Coastguard Worker g=f(n-r) 124*5a6e8488SAndroid Build Coastguard Worker f/=h*g 125*5a6e8488SAndroid Build Coastguard Worker scale=s 126*5a6e8488SAndroid Build Coastguard Worker return f 127*5a6e8488SAndroid Build Coastguard Worker} 128*5a6e8488SAndroid Build Coastguard Workerdefine fib(n){ 129*5a6e8488SAndroid Build Coastguard Worker auto i,t,p,r 130*5a6e8488SAndroid Build Coastguard Worker if(!n)return 0 131*5a6e8488SAndroid Build Coastguard Worker n=abs(n)$ 132*5a6e8488SAndroid Build Coastguard Worker t=1 133*5a6e8488SAndroid Build Coastguard Worker for (i=1;i<n;++i){ 134*5a6e8488SAndroid Build Coastguard Worker r=p 135*5a6e8488SAndroid Build Coastguard Worker p=t 136*5a6e8488SAndroid Build Coastguard Worker t+=r 137*5a6e8488SAndroid Build Coastguard Worker } 138*5a6e8488SAndroid Build Coastguard Worker return t 139*5a6e8488SAndroid Build Coastguard Worker} 140*5a6e8488SAndroid Build Coastguard Workerdefine log(x,b){ 141*5a6e8488SAndroid Build Coastguard Worker auto p,s 142*5a6e8488SAndroid Build Coastguard Worker s=scale 143*5a6e8488SAndroid Build Coastguard Worker if(scale<K)scale=K 144*5a6e8488SAndroid Build Coastguard Worker if(scale(x)>scale)scale=scale(x) 145*5a6e8488SAndroid Build Coastguard Worker scale*=2 146*5a6e8488SAndroid Build Coastguard Worker p=l(x)/l(b) 147*5a6e8488SAndroid Build Coastguard Worker scale=s 148*5a6e8488SAndroid Build Coastguard Worker return p@s 149*5a6e8488SAndroid Build Coastguard Worker} 150*5a6e8488SAndroid Build Coastguard Workerdefine l2(x){return log(x,2)} 151*5a6e8488SAndroid Build Coastguard Workerdefine l10(x){return log(x,A)} 152*5a6e8488SAndroid Build Coastguard Workerdefine root(x,n){ 153*5a6e8488SAndroid Build Coastguard Worker auto s,t,m,r,q,p 154*5a6e8488SAndroid Build Coastguard Worker if(n<0)sqrt(n) 155*5a6e8488SAndroid Build Coastguard Worker n=n$ 156*5a6e8488SAndroid Build Coastguard Worker if(n==0)x/n 157*5a6e8488SAndroid Build Coastguard Worker if(x==0||n==1)return x 158*5a6e8488SAndroid Build Coastguard Worker if(n==2)return sqrt(x) 159*5a6e8488SAndroid Build Coastguard Worker s=scale 160*5a6e8488SAndroid Build Coastguard Worker scale=0 161*5a6e8488SAndroid Build Coastguard Worker if(x<0&&n%2==0){ 162*5a6e8488SAndroid Build Coastguard Worker scale=s 163*5a6e8488SAndroid Build Coastguard Worker sqrt(x) 164*5a6e8488SAndroid Build Coastguard Worker } 165*5a6e8488SAndroid Build Coastguard Worker scale=s+scale(x)+5 166*5a6e8488SAndroid Build Coastguard Worker t=s+5 167*5a6e8488SAndroid Build Coastguard Worker m=(x<0) 168*5a6e8488SAndroid Build Coastguard Worker x=abs(x) 169*5a6e8488SAndroid Build Coastguard Worker p=n-1 170*5a6e8488SAndroid Build Coastguard Worker q=A^ceil((length(x$)/n)$,0) 171*5a6e8488SAndroid Build Coastguard Worker while(r@t!=q@t){ 172*5a6e8488SAndroid Build Coastguard Worker r=q 173*5a6e8488SAndroid Build Coastguard Worker q=(p*r+x/r^p)/n 174*5a6e8488SAndroid Build Coastguard Worker } 175*5a6e8488SAndroid Build Coastguard Worker if(m)r=-r 176*5a6e8488SAndroid Build Coastguard Worker scale=s 177*5a6e8488SAndroid Build Coastguard Worker return r@s 178*5a6e8488SAndroid Build Coastguard Worker} 179*5a6e8488SAndroid Build Coastguard Workerdefine cbrt(x){return root(x,3)} 180*5a6e8488SAndroid Build Coastguard Workerdefine gcd(a,b){ 181*5a6e8488SAndroid Build Coastguard Worker auto g,s 182*5a6e8488SAndroid Build Coastguard Worker if(!b)return a 183*5a6e8488SAndroid Build Coastguard Worker s=scale 184*5a6e8488SAndroid Build Coastguard Worker scale=0 185*5a6e8488SAndroid Build Coastguard Worker a=abs(a)$ 186*5a6e8488SAndroid Build Coastguard Worker b=abs(b)$ 187*5a6e8488SAndroid Build Coastguard Worker if(a<b){ 188*5a6e8488SAndroid Build Coastguard Worker g=a 189*5a6e8488SAndroid Build Coastguard Worker a=b 190*5a6e8488SAndroid Build Coastguard Worker b=g 191*5a6e8488SAndroid Build Coastguard Worker } 192*5a6e8488SAndroid Build Coastguard Worker while(b){ 193*5a6e8488SAndroid Build Coastguard Worker g=a%b 194*5a6e8488SAndroid Build Coastguard Worker a=b 195*5a6e8488SAndroid Build Coastguard Worker b=g 196*5a6e8488SAndroid Build Coastguard Worker } 197*5a6e8488SAndroid Build Coastguard Worker scale=s 198*5a6e8488SAndroid Build Coastguard Worker return a 199*5a6e8488SAndroid Build Coastguard Worker} 200*5a6e8488SAndroid Build Coastguard Workerdefine lcm(a,b){ 201*5a6e8488SAndroid Build Coastguard Worker auto r,s 202*5a6e8488SAndroid Build Coastguard Worker if(!a&&!b)return 0 203*5a6e8488SAndroid Build Coastguard Worker s=scale 204*5a6e8488SAndroid Build Coastguard Worker scale=0 205*5a6e8488SAndroid Build Coastguard Worker a=abs(a)$ 206*5a6e8488SAndroid Build Coastguard Worker b=abs(b)$ 207*5a6e8488SAndroid Build Coastguard Worker r=a*b/gcd(a,b) 208*5a6e8488SAndroid Build Coastguard Worker scale=s 209*5a6e8488SAndroid Build Coastguard Worker return r 210*5a6e8488SAndroid Build Coastguard Worker} 211*5a6e8488SAndroid Build Coastguard Workerdefine pi(s){ 212*5a6e8488SAndroid Build Coastguard Worker auto t,v 213*5a6e8488SAndroid Build Coastguard Worker if(s==0)return 3 214*5a6e8488SAndroid Build Coastguard Worker s=abs(s)$ 215*5a6e8488SAndroid Build Coastguard Worker t=scale 216*5a6e8488SAndroid Build Coastguard Worker scale=s+1 217*5a6e8488SAndroid Build Coastguard Worker v=4*a(1) 218*5a6e8488SAndroid Build Coastguard Worker scale=t 219*5a6e8488SAndroid Build Coastguard Worker return v@s 220*5a6e8488SAndroid Build Coastguard Worker} 221*5a6e8488SAndroid Build Coastguard Workerdefine t(x){ 222*5a6e8488SAndroid Build Coastguard Worker auto s,c 223*5a6e8488SAndroid Build Coastguard Worker l=scale 224*5a6e8488SAndroid Build Coastguard Worker scale+=2 225*5a6e8488SAndroid Build Coastguard Worker s=s(x) 226*5a6e8488SAndroid Build Coastguard Worker c=c(x) 227*5a6e8488SAndroid Build Coastguard Worker scale-=2 228*5a6e8488SAndroid Build Coastguard Worker return s/c 229*5a6e8488SAndroid Build Coastguard Worker} 230*5a6e8488SAndroid Build Coastguard Workerdefine a2(y,x){ 231*5a6e8488SAndroid Build Coastguard Worker auto a,p 232*5a6e8488SAndroid Build Coastguard Worker if(!x&&!y)y/x 233*5a6e8488SAndroid Build Coastguard Worker if(x<=0){ 234*5a6e8488SAndroid Build Coastguard Worker p=pi(scale+2) 235*5a6e8488SAndroid Build Coastguard Worker if(y<0)p=-p 236*5a6e8488SAndroid Build Coastguard Worker } 237*5a6e8488SAndroid Build Coastguard Worker if(x==0)a=p/2 238*5a6e8488SAndroid Build Coastguard Worker else{ 239*5a6e8488SAndroid Build Coastguard Worker scale+=2 240*5a6e8488SAndroid Build Coastguard Worker a=a(y/x)+p 241*5a6e8488SAndroid Build Coastguard Worker scale-=2 242*5a6e8488SAndroid Build Coastguard Worker } 243*5a6e8488SAndroid Build Coastguard Worker return a@scale 244*5a6e8488SAndroid Build Coastguard Worker} 245*5a6e8488SAndroid Build Coastguard Workerdefine sin(x){return s(x)} 246*5a6e8488SAndroid Build Coastguard Workerdefine cos(x){return c(x)} 247*5a6e8488SAndroid Build Coastguard Workerdefine atan(x){return a(x)} 248*5a6e8488SAndroid Build Coastguard Workerdefine tan(x){return t(x)} 249*5a6e8488SAndroid Build Coastguard Workerdefine atan2(y,x){return a2(y,x)} 250*5a6e8488SAndroid Build Coastguard Workerdefine r2d(x){ 251*5a6e8488SAndroid Build Coastguard Worker auto r,i,s 252*5a6e8488SAndroid Build Coastguard Worker s=scale 253*5a6e8488SAndroid Build Coastguard Worker scale+=5 254*5a6e8488SAndroid Build Coastguard Worker i=ibase 255*5a6e8488SAndroid Build Coastguard Worker ibase=A 256*5a6e8488SAndroid Build Coastguard Worker r=x*180/pi(scale) 257*5a6e8488SAndroid Build Coastguard Worker ibase=i 258*5a6e8488SAndroid Build Coastguard Worker scale=s 259*5a6e8488SAndroid Build Coastguard Worker return r@s 260*5a6e8488SAndroid Build Coastguard Worker} 261*5a6e8488SAndroid Build Coastguard Workerdefine d2r(x){ 262*5a6e8488SAndroid Build Coastguard Worker auto r,i,s 263*5a6e8488SAndroid Build Coastguard Worker s=scale 264*5a6e8488SAndroid Build Coastguard Worker scale+=5 265*5a6e8488SAndroid Build Coastguard Worker i=ibase 266*5a6e8488SAndroid Build Coastguard Worker ibase=A 267*5a6e8488SAndroid Build Coastguard Worker r=x*pi(scale)/180 268*5a6e8488SAndroid Build Coastguard Worker ibase=i 269*5a6e8488SAndroid Build Coastguard Worker scale=s 270*5a6e8488SAndroid Build Coastguard Worker return r@s 271*5a6e8488SAndroid Build Coastguard Worker} 272*5a6e8488SAndroid Build Coastguard Workerdefine frand(p){ 273*5a6e8488SAndroid Build Coastguard Worker p=abs(p)$ 274*5a6e8488SAndroid Build Coastguard Worker return irand(A^p)>>p 275*5a6e8488SAndroid Build Coastguard Worker} 276*5a6e8488SAndroid Build Coastguard Workerdefine ifrand(i,p){return irand(abs(i)$)+frand(p)} 277*5a6e8488SAndroid Build Coastguard Workerdefine i2rand(a,b){ 278*5a6e8488SAndroid Build Coastguard Worker auto n,x 279*5a6e8488SAndroid Build Coastguard Worker a=a$ 280*5a6e8488SAndroid Build Coastguard Worker b=b$ 281*5a6e8488SAndroid Build Coastguard Worker if(a==b)return a 282*5a6e8488SAndroid Build Coastguard Worker n=min(a,b) 283*5a6e8488SAndroid Build Coastguard Worker x=max(a,b) 284*5a6e8488SAndroid Build Coastguard Worker return irand(x-n+1)+n 285*5a6e8488SAndroid Build Coastguard Worker} 286*5a6e8488SAndroid Build Coastguard Workerdefine srand(x){ 287*5a6e8488SAndroid Build Coastguard Worker if(irand(2))return -x 288*5a6e8488SAndroid Build Coastguard Worker return x 289*5a6e8488SAndroid Build Coastguard Worker} 290*5a6e8488SAndroid Build Coastguard Workerdefine brand(){return irand(2)} 291*5a6e8488SAndroid Build Coastguard Workerdefine void output(x,b){ 292*5a6e8488SAndroid Build Coastguard Worker auto c 293*5a6e8488SAndroid Build Coastguard Worker c=obase 294*5a6e8488SAndroid Build Coastguard Worker obase=b 295*5a6e8488SAndroid Build Coastguard Worker x 296*5a6e8488SAndroid Build Coastguard Worker obase=c 297*5a6e8488SAndroid Build Coastguard Worker} 298*5a6e8488SAndroid Build Coastguard Workerdefine void hex(x){output(x,G)} 299*5a6e8488SAndroid Build Coastguard Workerdefine void binary(x){output(x,2)} 300*5a6e8488SAndroid Build Coastguard Workerdefine ubytes(x){ 301*5a6e8488SAndroid Build Coastguard Worker auto p,i 302*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$ 303*5a6e8488SAndroid Build Coastguard Worker i=2^8 304*5a6e8488SAndroid Build Coastguard Worker for(p=1;i-1<x;p*=2){i*=i} 305*5a6e8488SAndroid Build Coastguard Worker return p 306*5a6e8488SAndroid Build Coastguard Worker} 307*5a6e8488SAndroid Build Coastguard Workerdefine sbytes(x){ 308*5a6e8488SAndroid Build Coastguard Worker auto p,n,z 309*5a6e8488SAndroid Build Coastguard Worker z=(x<0) 310*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$ 311*5a6e8488SAndroid Build Coastguard Worker n=ubytes(x) 312*5a6e8488SAndroid Build Coastguard Worker p=2^(n*8-1) 313*5a6e8488SAndroid Build Coastguard Worker if(x>p||(!z&&x==p))n*=2 314*5a6e8488SAndroid Build Coastguard Worker return n 315*5a6e8488SAndroid Build Coastguard Worker} 316*5a6e8488SAndroid Build Coastguard Workerdefine s2un(x,n){ 317*5a6e8488SAndroid Build Coastguard Worker auto t,u,s 318*5a6e8488SAndroid Build Coastguard Worker x=x$ 319*5a6e8488SAndroid Build Coastguard Worker if(x<0){ 320*5a6e8488SAndroid Build Coastguard Worker x=abs(x) 321*5a6e8488SAndroid Build Coastguard Worker s=scale 322*5a6e8488SAndroid Build Coastguard Worker scale=0 323*5a6e8488SAndroid Build Coastguard Worker t=n*8 324*5a6e8488SAndroid Build Coastguard Worker u=2^(t-1) 325*5a6e8488SAndroid Build Coastguard Worker if(x==u)return x 326*5a6e8488SAndroid Build Coastguard Worker else if(x>u)x%=u 327*5a6e8488SAndroid Build Coastguard Worker scale=s 328*5a6e8488SAndroid Build Coastguard Worker return 2^(t)-x 329*5a6e8488SAndroid Build Coastguard Worker } 330*5a6e8488SAndroid Build Coastguard Worker return x 331*5a6e8488SAndroid Build Coastguard Worker} 332*5a6e8488SAndroid Build Coastguard Workerdefine s2u(x){return s2un(x,sbytes(x))} 333*5a6e8488SAndroid Build Coastguard Workerdefine void plz(x){ 334*5a6e8488SAndroid Build Coastguard Worker if(leading_zero())print x 335*5a6e8488SAndroid Build Coastguard Worker else{ 336*5a6e8488SAndroid Build Coastguard Worker if(x>-1&&x<1&&x!=0){ 337*5a6e8488SAndroid Build Coastguard Worker if(x<0)print"-" 338*5a6e8488SAndroid Build Coastguard Worker print 0,abs(x) 339*5a6e8488SAndroid Build Coastguard Worker } 340*5a6e8488SAndroid Build Coastguard Worker else print x 341*5a6e8488SAndroid Build Coastguard Worker } 342*5a6e8488SAndroid Build Coastguard Worker} 343*5a6e8488SAndroid Build Coastguard Workerdefine void plznl(x){ 344*5a6e8488SAndroid Build Coastguard Worker plz(x) 345*5a6e8488SAndroid Build Coastguard Worker print"\n" 346*5a6e8488SAndroid Build Coastguard Worker} 347*5a6e8488SAndroid Build Coastguard Workerdefine void pnlz(x){ 348*5a6e8488SAndroid Build Coastguard Worker auto s,i 349*5a6e8488SAndroid Build Coastguard Worker if(leading_zero()){ 350*5a6e8488SAndroid Build Coastguard Worker if(x>-1&&x<1&&x!=0){ 351*5a6e8488SAndroid Build Coastguard Worker s=scale(x) 352*5a6e8488SAndroid Build Coastguard Worker if(x<0)print"-" 353*5a6e8488SAndroid Build Coastguard Worker print"." 354*5a6e8488SAndroid Build Coastguard Worker x=abs(x) 355*5a6e8488SAndroid Build Coastguard Worker for(i=0;i<s;++i){ 356*5a6e8488SAndroid Build Coastguard Worker x<<=1 357*5a6e8488SAndroid Build Coastguard Worker print x$ 358*5a6e8488SAndroid Build Coastguard Worker x-=x$ 359*5a6e8488SAndroid Build Coastguard Worker } 360*5a6e8488SAndroid Build Coastguard Worker return 361*5a6e8488SAndroid Build Coastguard Worker } 362*5a6e8488SAndroid Build Coastguard Worker } 363*5a6e8488SAndroid Build Coastguard Worker print x 364*5a6e8488SAndroid Build Coastguard Worker} 365*5a6e8488SAndroid Build Coastguard Workerdefine void pnlznl(x){ 366*5a6e8488SAndroid Build Coastguard Worker pnlz(x) 367*5a6e8488SAndroid Build Coastguard Worker print"\n" 368*5a6e8488SAndroid Build Coastguard Worker} 369*5a6e8488SAndroid Build Coastguard Workerdefine void output_byte(x,i){ 370*5a6e8488SAndroid Build Coastguard Worker auto j,p,y,b,s 371*5a6e8488SAndroid Build Coastguard Worker s=scale 372*5a6e8488SAndroid Build Coastguard Worker scale=0 373*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$ 374*5a6e8488SAndroid Build Coastguard Worker b=x/(2^(i*8)) 375*5a6e8488SAndroid Build Coastguard Worker j=2^8 376*5a6e8488SAndroid Build Coastguard Worker b%=j 377*5a6e8488SAndroid Build Coastguard Worker y=log(j,obase) 378*5a6e8488SAndroid Build Coastguard Worker if(b>1)p=log(b,obase)+1 379*5a6e8488SAndroid Build Coastguard Worker else p=b 380*5a6e8488SAndroid Build Coastguard Worker for(i=y-p;i>0;--i)print 0 381*5a6e8488SAndroid Build Coastguard Worker if(b)print b 382*5a6e8488SAndroid Build Coastguard Worker scale=s 383*5a6e8488SAndroid Build Coastguard Worker} 384*5a6e8488SAndroid Build Coastguard Workerdefine void output_uint(x,n){ 385*5a6e8488SAndroid Build Coastguard Worker auto i 386*5a6e8488SAndroid Build Coastguard Worker for(i=n-1;i>=0;--i){ 387*5a6e8488SAndroid Build Coastguard Worker output_byte(x,i) 388*5a6e8488SAndroid Build Coastguard Worker if(i)print" " 389*5a6e8488SAndroid Build Coastguard Worker else print"\n" 390*5a6e8488SAndroid Build Coastguard Worker } 391*5a6e8488SAndroid Build Coastguard Worker} 392*5a6e8488SAndroid Build Coastguard Workerdefine void hex_uint(x,n){ 393*5a6e8488SAndroid Build Coastguard Worker auto o 394*5a6e8488SAndroid Build Coastguard Worker o=obase 395*5a6e8488SAndroid Build Coastguard Worker obase=G 396*5a6e8488SAndroid Build Coastguard Worker output_uint(x,n) 397*5a6e8488SAndroid Build Coastguard Worker obase=o 398*5a6e8488SAndroid Build Coastguard Worker} 399*5a6e8488SAndroid Build Coastguard Workerdefine void binary_uint(x,n){ 400*5a6e8488SAndroid Build Coastguard Worker auto o 401*5a6e8488SAndroid Build Coastguard Worker o=obase 402*5a6e8488SAndroid Build Coastguard Worker obase=2 403*5a6e8488SAndroid Build Coastguard Worker output_uint(x,n) 404*5a6e8488SAndroid Build Coastguard Worker obase=o 405*5a6e8488SAndroid Build Coastguard Worker} 406*5a6e8488SAndroid Build Coastguard Workerdefine void uintn(x,n){ 407*5a6e8488SAndroid Build Coastguard Worker if(scale(x)){ 408*5a6e8488SAndroid Build Coastguard Worker print"Error: ",x," is not an integer.\n" 409*5a6e8488SAndroid Build Coastguard Worker return 410*5a6e8488SAndroid Build Coastguard Worker } 411*5a6e8488SAndroid Build Coastguard Worker if(x<0){ 412*5a6e8488SAndroid Build Coastguard Worker print"Error: ",x," is negative.\n" 413*5a6e8488SAndroid Build Coastguard Worker return 414*5a6e8488SAndroid Build Coastguard Worker } 415*5a6e8488SAndroid Build Coastguard Worker if(x>=2^(n*8)){ 416*5a6e8488SAndroid Build Coastguard Worker print"Error: ",x," cannot fit into ",n," unsigned byte(s).\n" 417*5a6e8488SAndroid Build Coastguard Worker return 418*5a6e8488SAndroid Build Coastguard Worker } 419*5a6e8488SAndroid Build Coastguard Worker binary_uint(x,n) 420*5a6e8488SAndroid Build Coastguard Worker hex_uint(x,n) 421*5a6e8488SAndroid Build Coastguard Worker} 422*5a6e8488SAndroid Build Coastguard Workerdefine void intn(x,n){ 423*5a6e8488SAndroid Build Coastguard Worker auto t 424*5a6e8488SAndroid Build Coastguard Worker if(scale(x)){ 425*5a6e8488SAndroid Build Coastguard Worker print"Error: ",x," is not an integer.\n" 426*5a6e8488SAndroid Build Coastguard Worker return 427*5a6e8488SAndroid Build Coastguard Worker } 428*5a6e8488SAndroid Build Coastguard Worker t=2^(n*8-1) 429*5a6e8488SAndroid Build Coastguard Worker if(abs(x)>=t&&(x>0||x!=-t)){ 430*5a6e8488SAndroid Build Coastguard Worker print "Error: ",x," cannot fit into ",n," signed byte(s).\n" 431*5a6e8488SAndroid Build Coastguard Worker return 432*5a6e8488SAndroid Build Coastguard Worker } 433*5a6e8488SAndroid Build Coastguard Worker x=s2un(x,n) 434*5a6e8488SAndroid Build Coastguard Worker binary_uint(x,n) 435*5a6e8488SAndroid Build Coastguard Worker hex_uint(x,n) 436*5a6e8488SAndroid Build Coastguard Worker} 437*5a6e8488SAndroid Build Coastguard Workerdefine void uint8(x){uintn(x,1)} 438*5a6e8488SAndroid Build Coastguard Workerdefine void int8(x){intn(x,1)} 439*5a6e8488SAndroid Build Coastguard Workerdefine void uint16(x){uintn(x,2)} 440*5a6e8488SAndroid Build Coastguard Workerdefine void int16(x){intn(x,2)} 441*5a6e8488SAndroid Build Coastguard Workerdefine void uint32(x){uintn(x,4)} 442*5a6e8488SAndroid Build Coastguard Workerdefine void int32(x){intn(x,4)} 443*5a6e8488SAndroid Build Coastguard Workerdefine void uint64(x){uintn(x,8)} 444*5a6e8488SAndroid Build Coastguard Workerdefine void int64(x){intn(x,8)} 445*5a6e8488SAndroid Build Coastguard Workerdefine void uint(x){uintn(x,ubytes(x))} 446*5a6e8488SAndroid Build Coastguard Workerdefine void int(x){intn(x,sbytes(x))} 447*5a6e8488SAndroid Build Coastguard Workerdefine bunrev(t){ 448*5a6e8488SAndroid Build Coastguard Worker auto a,s,m[] 449*5a6e8488SAndroid Build Coastguard Worker s=scale 450*5a6e8488SAndroid Build Coastguard Worker scale=0 451*5a6e8488SAndroid Build Coastguard Worker t=abs(t)$ 452*5a6e8488SAndroid Build Coastguard Worker while(t!=1){ 453*5a6e8488SAndroid Build Coastguard Worker t=divmod(t,2,m[]) 454*5a6e8488SAndroid Build Coastguard Worker a*=2 455*5a6e8488SAndroid Build Coastguard Worker a+=m[0] 456*5a6e8488SAndroid Build Coastguard Worker } 457*5a6e8488SAndroid Build Coastguard Worker scale=s 458*5a6e8488SAndroid Build Coastguard Worker return a 459*5a6e8488SAndroid Build Coastguard Worker} 460*5a6e8488SAndroid Build Coastguard Workerdefine band(a,b){ 461*5a6e8488SAndroid Build Coastguard Worker auto s,t,m[],n[] 462*5a6e8488SAndroid Build Coastguard Worker a=abs(a)$ 463*5a6e8488SAndroid Build Coastguard Worker b=abs(b)$ 464*5a6e8488SAndroid Build Coastguard Worker if(b>a){ 465*5a6e8488SAndroid Build Coastguard Worker t=b 466*5a6e8488SAndroid Build Coastguard Worker b=a 467*5a6e8488SAndroid Build Coastguard Worker a=t 468*5a6e8488SAndroid Build Coastguard Worker } 469*5a6e8488SAndroid Build Coastguard Worker s=scale 470*5a6e8488SAndroid Build Coastguard Worker scale=0 471*5a6e8488SAndroid Build Coastguard Worker t=1 472*5a6e8488SAndroid Build Coastguard Worker while(b){ 473*5a6e8488SAndroid Build Coastguard Worker a=divmod(a,2,m[]) 474*5a6e8488SAndroid Build Coastguard Worker b=divmod(b,2,n[]) 475*5a6e8488SAndroid Build Coastguard Worker t*=2 476*5a6e8488SAndroid Build Coastguard Worker t+=(m[0]&&n[0]) 477*5a6e8488SAndroid Build Coastguard Worker } 478*5a6e8488SAndroid Build Coastguard Worker scale=s 479*5a6e8488SAndroid Build Coastguard Worker return bunrev(t) 480*5a6e8488SAndroid Build Coastguard Worker} 481*5a6e8488SAndroid Build Coastguard Workerdefine bor(a,b){ 482*5a6e8488SAndroid Build Coastguard Worker auto s,t,m[],n[] 483*5a6e8488SAndroid Build Coastguard Worker a=abs(a)$ 484*5a6e8488SAndroid Build Coastguard Worker b=abs(b)$ 485*5a6e8488SAndroid Build Coastguard Worker if(b>a){ 486*5a6e8488SAndroid Build Coastguard Worker t=b 487*5a6e8488SAndroid Build Coastguard Worker b=a 488*5a6e8488SAndroid Build Coastguard Worker a=t 489*5a6e8488SAndroid Build Coastguard Worker } 490*5a6e8488SAndroid Build Coastguard Worker s=scale 491*5a6e8488SAndroid Build Coastguard Worker scale=0 492*5a6e8488SAndroid Build Coastguard Worker t=1 493*5a6e8488SAndroid Build Coastguard Worker while(b){ 494*5a6e8488SAndroid Build Coastguard Worker a=divmod(a,2,m[]) 495*5a6e8488SAndroid Build Coastguard Worker b=divmod(b,2,n[]) 496*5a6e8488SAndroid Build Coastguard Worker t*=2 497*5a6e8488SAndroid Build Coastguard Worker t+=(m[0]||n[0]) 498*5a6e8488SAndroid Build Coastguard Worker } 499*5a6e8488SAndroid Build Coastguard Worker while(a){ 500*5a6e8488SAndroid Build Coastguard Worker a=divmod(a,2,m[]) 501*5a6e8488SAndroid Build Coastguard Worker t*=2 502*5a6e8488SAndroid Build Coastguard Worker t+=m[0] 503*5a6e8488SAndroid Build Coastguard Worker } 504*5a6e8488SAndroid Build Coastguard Worker scale=s 505*5a6e8488SAndroid Build Coastguard Worker return bunrev(t) 506*5a6e8488SAndroid Build Coastguard Worker} 507*5a6e8488SAndroid Build Coastguard Workerdefine bxor(a,b){ 508*5a6e8488SAndroid Build Coastguard Worker auto s,t,m[],n[] 509*5a6e8488SAndroid Build Coastguard Worker a=abs(a)$ 510*5a6e8488SAndroid Build Coastguard Worker b=abs(b)$ 511*5a6e8488SAndroid Build Coastguard Worker if(b>a){ 512*5a6e8488SAndroid Build Coastguard Worker t=b 513*5a6e8488SAndroid Build Coastguard Worker b=a 514*5a6e8488SAndroid Build Coastguard Worker a=t 515*5a6e8488SAndroid Build Coastguard Worker } 516*5a6e8488SAndroid Build Coastguard Worker s=scale 517*5a6e8488SAndroid Build Coastguard Worker scale=0 518*5a6e8488SAndroid Build Coastguard Worker t=1 519*5a6e8488SAndroid Build Coastguard Worker while(b){ 520*5a6e8488SAndroid Build Coastguard Worker a=divmod(a,2,m[]) 521*5a6e8488SAndroid Build Coastguard Worker b=divmod(b,2,n[]) 522*5a6e8488SAndroid Build Coastguard Worker t*=2 523*5a6e8488SAndroid Build Coastguard Worker t+=(m[0]+n[0]==1) 524*5a6e8488SAndroid Build Coastguard Worker } 525*5a6e8488SAndroid Build Coastguard Worker while(a){ 526*5a6e8488SAndroid Build Coastguard Worker a=divmod(a,2,m[]) 527*5a6e8488SAndroid Build Coastguard Worker t*=2 528*5a6e8488SAndroid Build Coastguard Worker t+=m[0] 529*5a6e8488SAndroid Build Coastguard Worker } 530*5a6e8488SAndroid Build Coastguard Worker scale=s 531*5a6e8488SAndroid Build Coastguard Worker return bunrev(t) 532*5a6e8488SAndroid Build Coastguard Worker} 533*5a6e8488SAndroid Build Coastguard Workerdefine bshl(a,b){return abs(a)$*2^abs(b)$} 534*5a6e8488SAndroid Build Coastguard Workerdefine bshr(a,b){return(abs(a)$/2^abs(b)$)$} 535*5a6e8488SAndroid Build Coastguard Workerdefine bnotn(x,n){ 536*5a6e8488SAndroid Build Coastguard Worker auto s,t,m[] 537*5a6e8488SAndroid Build Coastguard Worker s=scale 538*5a6e8488SAndroid Build Coastguard Worker scale=0 539*5a6e8488SAndroid Build Coastguard Worker t=2^(abs(n)$*8) 540*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$%t+t 541*5a6e8488SAndroid Build Coastguard Worker t=1 542*5a6e8488SAndroid Build Coastguard Worker while(x!=1){ 543*5a6e8488SAndroid Build Coastguard Worker x=divmod(x,2,m[]) 544*5a6e8488SAndroid Build Coastguard Worker t*=2 545*5a6e8488SAndroid Build Coastguard Worker t+=!m[0] 546*5a6e8488SAndroid Build Coastguard Worker } 547*5a6e8488SAndroid Build Coastguard Worker scale=s 548*5a6e8488SAndroid Build Coastguard Worker return bunrev(t) 549*5a6e8488SAndroid Build Coastguard Worker} 550*5a6e8488SAndroid Build Coastguard Workerdefine bnot8(x){return bnotn(x,1)} 551*5a6e8488SAndroid Build Coastguard Workerdefine bnot16(x){return bnotn(x,2)} 552*5a6e8488SAndroid Build Coastguard Workerdefine bnot32(x){return bnotn(x,4)} 553*5a6e8488SAndroid Build Coastguard Workerdefine bnot64(x){return bnotn(x,8)} 554*5a6e8488SAndroid Build Coastguard Workerdefine bnot(x){return bnotn(x,ubytes(x))} 555*5a6e8488SAndroid Build Coastguard Workerdefine brevn(x,n){ 556*5a6e8488SAndroid Build Coastguard Worker auto s,t,m[] 557*5a6e8488SAndroid Build Coastguard Worker s=scale 558*5a6e8488SAndroid Build Coastguard Worker scale=0 559*5a6e8488SAndroid Build Coastguard Worker t=2^(abs(n)$*8) 560*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$%t+t 561*5a6e8488SAndroid Build Coastguard Worker scale=s 562*5a6e8488SAndroid Build Coastguard Worker return bunrev(x) 563*5a6e8488SAndroid Build Coastguard Worker} 564*5a6e8488SAndroid Build Coastguard Workerdefine brev8(x){return brevn(x,1)} 565*5a6e8488SAndroid Build Coastguard Workerdefine brev16(x){return brevn(x,2)} 566*5a6e8488SAndroid Build Coastguard Workerdefine brev32(x){return brevn(x,4)} 567*5a6e8488SAndroid Build Coastguard Workerdefine brev64(x){return brevn(x,8)} 568*5a6e8488SAndroid Build Coastguard Workerdefine brev(x){return brevn(x,ubytes(x))} 569*5a6e8488SAndroid Build Coastguard Workerdefine broln(x,p,n){ 570*5a6e8488SAndroid Build Coastguard Worker auto s,t,m[] 571*5a6e8488SAndroid Build Coastguard Worker s=scale 572*5a6e8488SAndroid Build Coastguard Worker scale=0 573*5a6e8488SAndroid Build Coastguard Worker n=abs(n)$*8 574*5a6e8488SAndroid Build Coastguard Worker p=abs(p)$%n 575*5a6e8488SAndroid Build Coastguard Worker t=2^n 576*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$%t 577*5a6e8488SAndroid Build Coastguard Worker if(!p)return x 578*5a6e8488SAndroid Build Coastguard Worker x=divmod(x,2^(n-p),m[]) 579*5a6e8488SAndroid Build Coastguard Worker x+=m[0]*2^p%t 580*5a6e8488SAndroid Build Coastguard Worker scale=s 581*5a6e8488SAndroid Build Coastguard Worker return x 582*5a6e8488SAndroid Build Coastguard Worker} 583*5a6e8488SAndroid Build Coastguard Workerdefine brol8(x,p){return broln(x,p,1)} 584*5a6e8488SAndroid Build Coastguard Workerdefine brol16(x,p){return broln(x,p,2)} 585*5a6e8488SAndroid Build Coastguard Workerdefine brol32(x,p){return broln(x,p,4)} 586*5a6e8488SAndroid Build Coastguard Workerdefine brol64(x,p){return broln(x,p,8)} 587*5a6e8488SAndroid Build Coastguard Workerdefine brol(x,p){return broln(x,p,ubytes(x))} 588*5a6e8488SAndroid Build Coastguard Workerdefine brorn(x,p,n){ 589*5a6e8488SAndroid Build Coastguard Worker auto s,t,m[] 590*5a6e8488SAndroid Build Coastguard Worker s=scale 591*5a6e8488SAndroid Build Coastguard Worker scale=0 592*5a6e8488SAndroid Build Coastguard Worker n=abs(n)$*8 593*5a6e8488SAndroid Build Coastguard Worker p=abs(p)$%n 594*5a6e8488SAndroid Build Coastguard Worker t=2^n 595*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$%t 596*5a6e8488SAndroid Build Coastguard Worker if(!p)return x 597*5a6e8488SAndroid Build Coastguard Worker x=divmod(x,2^p,m[]) 598*5a6e8488SAndroid Build Coastguard Worker x+=m[0]*2^(n-p)%t 599*5a6e8488SAndroid Build Coastguard Worker scale=s 600*5a6e8488SAndroid Build Coastguard Worker return x 601*5a6e8488SAndroid Build Coastguard Worker} 602*5a6e8488SAndroid Build Coastguard Workerdefine bror8(x,p){return brorn(x,p,1)} 603*5a6e8488SAndroid Build Coastguard Workerdefine bror16(x,p){return brorn(x,p,2)} 604*5a6e8488SAndroid Build Coastguard Workerdefine bror32(x,p){return brorn(x,p,4)} 605*5a6e8488SAndroid Build Coastguard Workerdefine bror64(x,p){return brorn(x,p,8)} 606*5a6e8488SAndroid Build Coastguard Workerdefine brol(x,p){return brorn(x,p,ubytes(x))} 607*5a6e8488SAndroid Build Coastguard Workerdefine bmodn(x,n){ 608*5a6e8488SAndroid Build Coastguard Worker auto s 609*5a6e8488SAndroid Build Coastguard Worker s=scale 610*5a6e8488SAndroid Build Coastguard Worker scale=0 611*5a6e8488SAndroid Build Coastguard Worker x=abs(x)$%2^(abs(n)$*8) 612*5a6e8488SAndroid Build Coastguard Worker scale=s 613*5a6e8488SAndroid Build Coastguard Worker return x 614*5a6e8488SAndroid Build Coastguard Worker} 615*5a6e8488SAndroid Build Coastguard Workerdefine bmod8(x){return bmodn(x,1)} 616*5a6e8488SAndroid Build Coastguard Workerdefine bmod16(x){return bmodn(x,2)} 617*5a6e8488SAndroid Build Coastguard Workerdefine bmod32(x){return bmodn(x,4)} 618*5a6e8488SAndroid Build Coastguard Workerdefine bmod64(x){return bmodn(x,8)} 619