congruence-solver
Version:
Single variable linear and quadratic congruence solver
2 lines • 3.81 kB
JavaScript
;var _=Object.create;var C=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var j=(r,e)=>{for(var o in e)C(r,o,{get:e[o],enumerable:!0})},S=(r,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of A(e))!Q.call(r,n)&&n!==o&&C(r,n,{get:()=>e[n],enumerable:!(t=q(e,n))||t.enumerable});return r};var y=(r,e,o)=>(o=r!=null?_(O(r)):{},S(e||!r||!r.__esModule?C(o,"default",{value:r,enumerable:!0}):o,r)),F=r=>S(C({},"__esModule",{value:!0}),r);var B={};j(B,{ALL_RESIDUES:()=>M,NO_RESIDUES:()=>x,factor:()=>w,gcd:()=>g,intersectResidues:()=>N,inverseMod:()=>a,powMod:()=>R,solveLinearCongruence:()=>v,solveQuadraticCongruence:()=>D,sqrtModPrime:()=>E});module.exports=F(B);var L=y(require("minimalistic-assert"),1);function w(r){(0,L.default)(r>0&&r%1===0);let e=[];for(;r%2===0;)e.push(2),r/=2;for(;r%3===0;)e.push(3),r/=3;for(let o=5;o*o<=r;){for(;r%o===0;)e.push(o),r/=o;for(o+=2;r%o===0;)e.push(o),r/=o;o+=4}return r>1&&e.push(r),e}function g(r,e){for(;e!==0;){let o=e;e=r%e,r=o}return Math.abs(r)}function a(r,e,o=!0){e<0&&(e=-e),r<0&&(r=r%e+e);let t=1,n=0;for(;e!==0;){let u=r%e,l=(r-u)/e,i=t;r=e,e=u,t=n,n=i-l*n}return r!==1&&o?NaN:t>=0?t:t+n}var x={res:[],mod:1},M={res:[0],mod:1};function N(...r){let e=[0],o=1;for(let{res:t,mod:n}of r){if(n===0)return x;n<0&&(n=-n);let u=g(o,n),l=a(o/u,n/u)*o/u,i=o*n/u,s=[];for(let m of e)for(let f of t){let c=f-m;if(c%u!==0)continue;let h=(m+c*l)%i;s.push(h>=0?h:h+i)}e=s,o=i}return e.length===0?x:{res:e.sort((t,n)=>t-n),mod:o}}function v(r,e,o){if(o===0)return x;let t=g(r,o);if(e%t!==0)return x;o=Math.abs(o);let n=o/t;return{res:[(o-e%o)/t*a(r/t,n)%n],mod:n}}function R(r,e,o){let t=1;for(;e>0;)e%2&&(t=t*r%o),r=r*r%o,e>>=1;return t<0?t+o:t}var P=y(require("minimalistic-assert"),1);function E(r,e){if(e=Math.abs(e),(0,P.default)(e<=94906249),r%=e,r===0)return 0;if(r<0&&(r+=e),e===2||r===1)return 1;if(R(r,(e-1)/2,e)!==1)return NaN;let o=e-1,t=0;for(;o%2===0;o/=2)t++;if(t===1){let m=R(r,(e+1)/4,e);return Math.min(m,e-m)}let n=2;for(;R(n,(e-1)/2,e)===1;)n++;let u=R(n,o,e),l=R(r,(o-1)/2,e),i=l*r%e,s=l*i%e;for(;s!==1;){let m=1;for(let f=s*s%e;f!==1;f=f*f%e)m++;for(;--t>m;)u=u*u%e;i=i*u%e,u=u*u%e,s=s*u%e}return Math.min(i,e-i)}function H(r,e,o,t){if(r%=t,r===0)return v(e,o,t);t<0&&(t=-t);let n=a(r+t,t);if(e=e*n%t,o=o*n%t,t===2)return e===0?{res:[o],mod:2}:o===0?M:x;let u=(e%2!==0?e-t:e)/2,l=E(u*u-o,t);if(l!==l)return x;if(l===0)return{res:[(t-u)%t],mod:t};let i=(t+l-u)%t,s=(t-l-u)%t;return{res:i<s?[i,s]:[s,i],mod:t}}function z(r,e,o,t,n){if(n===0)return M;let u=H(r,e,o,t);if(n===1)return u;let{res:l,mod:i}=u;if(l.length===0)return x;let s=l.concat();t<0&&(t=-t),i===1&&t===2&&([s,i]=[[0,1],2]);let m=1,f=t;if(i>1){for(let c=0;c<s.length;c++){let h,d=s[c];for(f=t,m=1;m<n&&(h=(2*r*d+e)%t)!==0;m++){let b=(r*d+e)*d+o;d+=f*(a(t-h,t)*(b/f)%t),f*=t,d%=f}s[c]=d<0?d+f:d}s.sort((c,h)=>c-h),i=f}for(;m<n;m++){let c=[],h=f*t;e:for(let d=0;d<f;d+=i)for(let b of s)if(b+=d,((r*b+e)*b+o)%h===0&&c.push(b)>2)break e;if(s=c,s.length===0)return x;s.length===2&&f===2?(i=1,s.length=1):s.length<=2?i=f:s[1]-s[0]===s[2]-s[1]?(i=s[1]-s[0],s.length=1):(i=s[2]-s[0],s.length=2),f=h}return{res:s,mod:i}}function D(r,e,o,t){if(t===0)return x;let n=Array.isArray(t)?t:w(t),u=[0],l=1,i=n[0],s=1;for(let m=1;m<=n.length;m++)if(n[m]!==i){let{res:f,mod:c}=z(r,e,o,i,s);if(f.length===0)return x;if(c>1){let h=(a(l,c)+c)*l;l*=c;let d=[];for(let b of u){let I=b+(l-b)*h;for(let U of f)d.push((I+U*h)%l)}u=d}i=n[m],s=1}else s++;return{res:u.sort((m,f)=>m-f),mod:l}}0&&(module.exports={ALL_RESIDUES,NO_RESIDUES,factor,gcd,intersectResidues,inverseMod,powMod,solveLinearCongruence,solveQuadraticCongruence,sqrtModPrime});
//# sourceMappingURL=index.cjs.map