1*5a6e8488SAndroid Build Coastguard Workerdefine fast_gcd(a, b) { 2*5a6e8488SAndroid Build Coastguard Worker 3*5a6e8488SAndroid Build Coastguard Worker if (a == b) return a; 4*5a6e8488SAndroid Build Coastguard Worker if (a > b) return fast_gcd(a - b, b) 5*5a6e8488SAndroid Build Coastguard Worker 6*5a6e8488SAndroid Build Coastguard Worker return fast_gcd(a, b - a); 7*5a6e8488SAndroid Build Coastguard Worker} 8*5a6e8488SAndroid Build Coastguard Worker 9*5a6e8488SAndroid Build Coastguard Workerdefine void r_reduce(*r[]) { 10*5a6e8488SAndroid Build Coastguard Worker 11*5a6e8488SAndroid Build Coastguard Worker auto g,s; 12*5a6e8488SAndroid Build Coastguard Worker 13*5a6e8488SAndroid Build Coastguard Worker if (length(r[]) != 2) sqrt(-1); 14*5a6e8488SAndroid Build Coastguard Worker if (scale(r[0])) 2^r[0]; 15*5a6e8488SAndroid Build Coastguard Worker if (scale(r[1])) 2^r[1]; 16*5a6e8488SAndroid Build Coastguard Worker 17*5a6e8488SAndroid Build Coastguard Worker if (r[0] >= 0 && r[1] >= 0) g = fast_gcd(r[0], r[1]); 18*5a6e8488SAndroid Build Coastguard Worker else g = gcd(r[0], r[1]); 19*5a6e8488SAndroid Build Coastguard Worker 20*5a6e8488SAndroid Build Coastguard Worker s = scale; 21*5a6e8488SAndroid Build Coastguard Worker scale = 0; 22*5a6e8488SAndroid Build Coastguard Worker 23*5a6e8488SAndroid Build Coastguard Worker r[0] /= g; 24*5a6e8488SAndroid Build Coastguard Worker r[1] /= g; 25*5a6e8488SAndroid Build Coastguard Worker 26*5a6e8488SAndroid Build Coastguard Worker scale = s; 27*5a6e8488SAndroid Build Coastguard Worker} 28*5a6e8488SAndroid Build Coastguard Worker 29*5a6e8488SAndroid Build Coastguard Workerdefine void r_init(*r[], a, b) { 30*5a6e8488SAndroid Build Coastguard Worker r[0] = a; 31*5a6e8488SAndroid Build Coastguard Worker r[1] = b; 32*5a6e8488SAndroid Build Coastguard Worker r_reduce(r[]); 33*5a6e8488SAndroid Build Coastguard Worker} 34*5a6e8488SAndroid Build Coastguard Worker 35*5a6e8488SAndroid Build Coastguard Workerdefine void r_initi(*r[], i, a, b) { 36*5a6e8488SAndroid Build Coastguard Worker 37*5a6e8488SAndroid Build Coastguard Worker length(r[]); 38*5a6e8488SAndroid Build Coastguard Worker 39*5a6e8488SAndroid Build Coastguard Worker r[0] = i * b + a; 40*5a6e8488SAndroid Build Coastguard Worker r[1] = b; 41*5a6e8488SAndroid Build Coastguard Worker 42*5a6e8488SAndroid Build Coastguard Worker length(r[]); 43*5a6e8488SAndroid Build Coastguard Worker 44*5a6e8488SAndroid Build Coastguard Worker r_reduce(r[]); 45*5a6e8488SAndroid Build Coastguard Worker} 46*5a6e8488SAndroid Build Coastguard Worker 47*5a6e8488SAndroid Build Coastguard Workerlength(a[]) 48*5a6e8488SAndroid Build Coastguard Workerr_initi(a[], 5, 63, 94); 49