congruence-solver
Version:
Single variable linear and quadratic congruence solver
2 lines • 3.01 kB
JavaScript
import y from"minimalistic-assert";function C(t){y(t>0&&t%1===0);let e=[];for(;t%2===0;)e.push(2),t/=2;for(;t%3===0;)e.push(3),t/=3;for(let o=5;o*o<=t;){for(;t%o===0;)e.push(o),t/=o;for(o+=2;t%o===0;)e.push(o),t/=o;o+=4}return t>1&&e.push(t),e}function g(t,e){for(;e!==0;){let o=e;e=t%e,t=o}return Math.abs(t)}function b(t,e,o=!0){e<0&&(e=-e),t<0&&(t=t%e+e);let r=1,s=0;for(;e!==0;){let u=t%e,l=(t-u)/e,i=r;t=e,e=u,r=s,s=i-l*s}return t!==1&&o?NaN:r>=0?r:r+s}var x={res:[],mod:1},M={res:[0],mod:1};function L(...t){let e=[0],o=1;for(let{res:r,mod:s}of t){if(s===0)return x;s<0&&(s=-s);let u=g(o,s),l=b(o/u,s/u)*o/u,i=o*s/u,n=[];for(let m of e)for(let f of r){let c=f-m;if(c%u!==0)continue;let h=(m+c*l)%i;n.push(h>=0?h:h+i)}e=n,o=i}return e.length===0?x:{res:e.sort((r,s)=>r-s),mod:o}}function w(t,e,o){if(o===0)return x;let r=g(t,o);if(e%r!==0)return x;o=Math.abs(o);let s=o/r;return{res:[(o-e%o)/r*b(t/r,s)%s],mod:s}}function R(t,e,o){let r=1;for(;e>0;)e%2&&(r=r*t%o),t=t*t%o,e>>=1;return r<0?r+o:r}import N from"minimalistic-assert";function v(t,e){if(e=Math.abs(e),N(e<=94906249),t%=e,t===0)return 0;if(t<0&&(t+=e),e===2||t===1)return 1;if(R(t,(e-1)/2,e)!==1)return NaN;let o=e-1,r=0;for(;o%2===0;o/=2)r++;if(r===1){let m=R(t,(e+1)/4,e);return Math.min(m,e-m)}let s=2;for(;R(s,(e-1)/2,e)===1;)s++;let u=R(s,o,e),l=R(t,(o-1)/2,e),i=l*t%e,n=l*i%e;for(;n!==1;){let m=1;for(let f=n*n%e;f!==1;f=f*f%e)m++;for(;--r>m;)u=u*u%e;i=i*u%e,u=u*u%e,n=n*u%e}return Math.min(i,e-i)}function P(t,e,o,r){if(t%=r,t===0)return w(e,o,r);r<0&&(r=-r);let s=b(t+r,r);if(e=e*s%r,o=o*s%r,r===2)return e===0?{res:[o],mod:2}:o===0?M:x;let u=(e%2!==0?e-r:e)/2,l=v(u*u-o,r);if(l!==l)return x;if(l===0)return{res:[(r-u)%r],mod:r};let i=(r+l-u)%r,n=(r-l-u)%r;return{res:i<n?[i,n]:[n,i],mod:r}}function D(t,e,o,r,s){if(s===0)return M;let u=P(t,e,o,r);if(s===1)return u;let{res:l,mod:i}=u;if(l.length===0)return x;let n=l.concat();r<0&&(r=-r),i===1&&r===2&&([n,i]=[[0,1],2]);let m=1,f=r;if(i>1){for(let c=0;c<n.length;c++){let h,d=n[c];for(f=r,m=1;m<s&&(h=(2*t*d+e)%r)!==0;m++){let a=(t*d+e)*d+o;d+=f*(b(r-h,r)*(a/f)%r),f*=r,d%=f}n[c]=d<0?d+f:d}n.sort((c,h)=>c-h),i=f}for(;m<s;m++){let c=[],h=f*r;e:for(let d=0;d<f;d+=i)for(let a of n)if(a+=d,((t*a+e)*a+o)%h===0&&c.push(a)>2)break e;if(n=c,n.length===0)return x;n.length===2&&f===2?(i=1,n.length=1):n.length<=2?i=f:n[1]-n[0]===n[2]-n[1]?(i=n[1]-n[0],n.length=1):(i=n[2]-n[0],n.length=2),f=h}return{res:n,mod:i}}function I(t,e,o,r){if(r===0)return x;let s=Array.isArray(r)?r:C(r),u=[0],l=1,i=s[0],n=1;for(let m=1;m<=s.length;m++)if(s[m]!==i){let{res:f,mod:c}=D(t,e,o,i,n);if(f.length===0)return x;if(c>1){let h=(b(l,c)+c)*l;l*=c;let d=[];for(let a of u){let E=a+(l-a)*h;for(let S of f)d.push((E+S*h)%l)}u=d}i=s[m],n=1}else n++;return{res:u.sort((m,f)=>m-f),mod:l}}export{M as ALL_RESIDUES,x as NO_RESIDUES,C as factor,g as gcd,L as intersectResidues,b as inverseMod,R as powMod,w as solveLinearCongruence,I as solveQuadraticCongruence,v as sqrtModPrime};
//# sourceMappingURL=index.js.map