-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy paththreshold.min.js
1 lines (1 loc) · 1.2 KB
/
threshold.min.js
1
var fraction=require("fraction.js"),polyval=require("compute-polynomial"),bigInt=require("big-integer");module.exports={keyDist:function(a,b,c,d){if(null==b)var b=Math.floor(a/2)+1;for(var e=[],f=[],g=[],h=[],i=1;i<=a;i++)g.push(i);for(var i=1;i<b;i++)h.push(random_prime(1e3,1e7));h.push(c);for(var e=polyval(h,g),i=0;i<a;i++)e[i]%=d,f.push([i+1,e[i]]);return f},keyConst:function(a,b){var c=polyInterpolation(a),d=mod(c,b);return d.n}};var polyInterpolation=function(a){for(var b=new fraction(0),c=0;c<a.length;c++){for(var d=new fraction(1),e=0;e<a.length;e++)if(c!=e){var f=a[e][0]*-1,g=a[c][0]-a[e][0],h=new fraction(f).div(g);d=d.mul(h)}b=b.add(d.mul(a[c][1]))}return b},random_prime=function(a,b){var c=Math.floor(Math.random()*(b-1-a+1))+a;return bigInt(c).isPrime()===!0?c:random_prime(a,b)},euclidsExtended=function(a,b){return 0==a?[b,0,1]:(temp=euclidsExtended(b%a,a),g=temp[0],x=temp[1],y=temp[2],[g,y-x*Math.floor(b/a),x])},modInv=function(a,b){var c=euclidsExtended(a,b)[1];return c<0&&(c+=b),c},mod=function(a,b){var a=new fraction(a).mod(b).add(b).mod(b),c=Math.floor(a),d=new fraction(a.mod(1).abs());return 0!=d?mod(mod(c,b)+modFraction(d,b),b):a.mod(b)},modFraction=function(a,b){return a.n*modInv(a.d,b)};