better structure and code
This commit is contained in:
parent
8e5c19769b
commit
37a737e56d
|
@ -1,34 +0,0 @@
|
||||||
{
|
|
||||||
"env": {
|
|
||||||
"node": true,
|
|
||||||
"browser": true,
|
|
||||||
"mocha": true
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 2017,
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"rules": {
|
|
||||||
"no-console": 0,
|
|
||||||
"indent": [
|
|
||||||
"error",
|
|
||||||
4
|
|
||||||
],
|
|
||||||
"linebreak-style": [
|
|
||||||
"error",
|
|
||||||
"unix"
|
|
||||||
],
|
|
||||||
"quotes": [
|
|
||||||
"error",
|
|
||||||
"single"
|
|
||||||
],
|
|
||||||
"semi": [
|
|
||||||
"error",
|
|
||||||
"always"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"globals": {
|
|
||||||
"BigInt": "readonly"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,68 +1,16 @@
|
||||||
# Project specific files
|
|
||||||
dist/bigint-mod-arith-?.?.?.*
|
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
logs
|
logs
|
||||||
*.log
|
*.log
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
|
||||||
yarn-error.log*
|
|
||||||
|
|
||||||
# Runtime data
|
|
||||||
pids
|
|
||||||
*.pid
|
|
||||||
*.seed
|
|
||||||
*.pid.lock
|
|
||||||
|
|
||||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
||||||
lib-cov
|
|
||||||
|
|
||||||
# Coverage directory used by tools like istanbul
|
|
||||||
coverage
|
|
||||||
|
|
||||||
# nyc test coverage
|
|
||||||
.nyc_output
|
|
||||||
|
|
||||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
|
||||||
.grunt
|
|
||||||
|
|
||||||
# Bower dependency directory (https://bower.io/)
|
|
||||||
bower_components
|
|
||||||
|
|
||||||
# node-waf configuration
|
|
||||||
.lock-wscript
|
|
||||||
|
|
||||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
||||||
build/Release
|
|
||||||
|
|
||||||
# Dependency directories
|
# Dependency directories
|
||||||
node_modules/
|
node_modules/
|
||||||
jspm_packages/
|
|
||||||
|
|
||||||
# TypeScript v1 declaration files
|
|
||||||
typings/
|
|
||||||
|
|
||||||
# Optional npm cache directory
|
|
||||||
.npm
|
|
||||||
|
|
||||||
# Optional eslint cache
|
|
||||||
.eslintcache
|
|
||||||
|
|
||||||
# Optional REPL history
|
|
||||||
.node_repl_history
|
|
||||||
|
|
||||||
# Output of 'npm pack'
|
# Output of 'npm pack'
|
||||||
*.tgz
|
*.tgz
|
||||||
|
|
||||||
# Yarn Integrity file
|
|
||||||
.yarn-integrity
|
|
||||||
|
|
||||||
# dotenv environment variables file
|
|
||||||
.env
|
|
||||||
|
|
||||||
# next.js build output
|
|
||||||
.next
|
|
||||||
|
|
||||||
# Visual Studio Code
|
# Visual Studio Code
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
.idea/
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Build scripts
|
||||||
|
build/*
|
||||||
|
|
||||||
|
# Source files
|
||||||
|
src/*
|
||||||
|
|
||||||
|
# Test files
|
||||||
|
test/*
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Visual Studio Code
|
||||||
|
.vscode
|
|
@ -0,0 +1,121 @@
|
||||||
|
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
|
||||||
|
|
||||||
|
# Skeleton for both Node.js and native JS modules
|
||||||
|
|
||||||
|
Clone this repo to your desired project directory (`my-project` in the following example), unlink the git, install the required development dependencies and start working.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/juanelas/node-browser-skel.git my-project
|
||||||
|
cd my-project
|
||||||
|
rm -rf .git .gitignore lib/.gitignore test/browser/.gitignore types/.gitignore README.md
|
||||||
|
npm i -D rollup @rollup/plugin-commonjs @rollup/plugin-multi-entry @rollup/plugin-node-resolve @rollup/plugin-replace chai jsdoc-to-markdown mocha npm-run-all rollup-plugin-terser standard typescript
|
||||||
|
```
|
||||||
|
A new JS project is created and it is ready to bundle IIFE, ESM and CJS modules with the corresponding declaration files for TypeScript. Code follows [JavaScript Standard](https://standardjs.com) style. The bundles are created with [Rollup](https://rollupjs.org).
|
||||||
|
|
||||||
|
A structure like the following is going to be created:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── build/
|
||||||
|
│ ├── build.dts.js
|
||||||
|
│ ├── rollup.config.js
|
||||||
|
│ └── rollup.tests.config.js
|
||||||
|
├── INSTRUCTIONS.md
|
||||||
|
├── lib/
|
||||||
|
├── LICENSE
|
||||||
|
├── package.json
|
||||||
|
├── src/
|
||||||
|
│ ├── browser/
|
||||||
|
│ │ └── tests-template.html
|
||||||
|
│ ├── doc/
|
||||||
|
│ │ └── readme-template.md
|
||||||
|
│ └── js/
|
||||||
|
│ └── index.js
|
||||||
|
├── test/
|
||||||
|
│ ├── browser/
|
||||||
|
│ └── test1.js
|
||||||
|
└── types/
|
||||||
|
```
|
||||||
|
|
||||||
|
The file `INSTRUCTIONS.md` contains a copy of what you are reading now. You can safely delete it when you don't need it any more.
|
||||||
|
|
||||||
|
## Init your project
|
||||||
|
|
||||||
|
Edit `package.json` to suit your needs and initialize the project with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
The `README.md` file of your project will be created during the build process, DO NOT EDIT it; edit `./src/doc/readme-template.md` instead. The JS Doc will be automatically added to the end of the `README.md`.
|
||||||
|
|
||||||
|
After editing `./src/doc/readme-template.md`, you can build your `README.md` as:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run build:docs
|
||||||
|
```
|
||||||
|
|
||||||
|
## Write JS code and build for node.js and native browsers
|
||||||
|
|
||||||
|
Write your code in ES6 using file `./src/js/index.js`. You can use boolean variable `process.browser` to create specific code for native JS or Node. For example:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
if (process.browser) {
|
||||||
|
// browser specific code here
|
||||||
|
} else {
|
||||||
|
// node.js specific code here
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Once your source code is ready, you can build the final browser/node files (the node.js specific code will be stripped from the browser final files and vice versa) as:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build:js
|
||||||
|
```
|
||||||
|
|
||||||
|
Final browser/node files include an ESM file, a bundle ESM file, and a bundle IIFE file for browsers; and a CJS module for node:
|
||||||
|
|
||||||
|
```
|
||||||
|
lib
|
||||||
|
├── index.browser.bundle.js
|
||||||
|
├── index.browser.bundle.mod.js
|
||||||
|
├── index.browser.mod.js
|
||||||
|
└── index.node.js
|
||||||
|
```
|
||||||
|
|
||||||
|
A file with Typescript definition types can also be built to `./types/index.d.ts` with :
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run build:dts
|
||||||
|
```
|
||||||
|
|
||||||
|
> Consider using JS Doc with your exports. If the JS doc includes typing in the documentation, the created types definition file will honour the JS doc typing instead of using `any` everywhere.
|
||||||
|
|
||||||
|
## Create and run tests for node.js and browser
|
||||||
|
|
||||||
|
Mocha/Chai tests are created using Node.js common js format and should be placed in directory `./test/`. You can create separate test files but follow the instructions in `./test/test1.js`.
|
||||||
|
|
||||||
|
You can run tests in Node.js with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
Browser tests are built from the node.js ones:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run build:browserTests
|
||||||
|
```
|
||||||
|
|
||||||
|
Don't forget rebuilding after adding/modifying a test.
|
||||||
|
|
||||||
|
> Opening the browser tests requires a local live server to serve `./test/browser/index.html`. With VSCode, you can use the [Live Server extension](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) and just right click over the file and `Open with Live Server`; although any other server solution should be fine.
|
||||||
|
|
||||||
|
## Build all in one step
|
||||||
|
|
||||||
|
You can just go through all the build steps in one step:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run build
|
||||||
|
```
|
68
README.hbs
68
README.hbs
|
@ -1,68 +0,0 @@
|
||||||
# bigint-mod-arith
|
|
||||||
|
|
||||||
**IMPORTANT! This package has been superseded by [bigint-crypto-utils](https://github.com/juanelas/bigint-crypto-utils)**. Please install that package instead.
|
|
||||||
|
|
||||||
Some extra functions to work with modular arithmetics using native JS (stage 3) implementation of BigInt. It can be used by any [Web Browser or webview supporting BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) and with Node.js (>=10.4.0).
|
|
||||||
|
|
||||||
If you are also looking for a cryptographically-secure random generator and for strong probable primes (generation and testing), you should consider moving to [bigint-crypto-utils](https://github.com/juanelas/bigint-crypto-utils)
|
|
||||||
|
|
||||||
_The operations supported on BigInts are not constant time. BigInt can be therefore **[unsuitable for use in cryptography](https://www.chosenplaintext.ca/articles/beginners-guide-constant-time-cryptography.html).** Many platforms provide native support for cryptography, such as [Web Cryptography API](https://w3c.github.io/webcrypto/) or [Node.js Crypto](https://nodejs.org/dist/latest/docs/api/crypto.html)._
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
bigint-mod-arith is distributed for [web browsers and/or webviews supporting
|
|
||||||
BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility)
|
|
||||||
as an ES6 module or an IIFE file; and for Node.js (>=10.4.0), as a CJS module.
|
|
||||||
|
|
||||||
bigint-mod-arith can be imported to your project with `npm`:
|
|
||||||
```bash
|
|
||||||
npm install bigint-mod-arith
|
|
||||||
```
|
|
||||||
NPM installation defaults to the ES6 module for browsers and the CJS one for Node.js.
|
|
||||||
|
|
||||||
For web browsers, you can also directly download the minimised version of the [IIFE file](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bigint-mod-arith-latest.browser.min.js) or the [ES6 module](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bigint-mod-arith-latest.browser.mod.min.js) from GitHub.
|
|
||||||
|
|
||||||
## Usage example
|
|
||||||
|
|
||||||
With node js:
|
|
||||||
```javascript
|
|
||||||
const bigintModArith = require('bigint-mod-arith');
|
|
||||||
|
|
||||||
/* Stage 3 BigInts with value 666 can be declared as BigInt('666')
|
|
||||||
or the shorter new no-so-linter-friendly syntax 666n.
|
|
||||||
Notice that you can also pass a number, e.g. BigInt(666), but it is not
|
|
||||||
recommended since values over 2**53 - 1 won't be safe but no warning will
|
|
||||||
be raised.
|
|
||||||
*/
|
|
||||||
let a = BigInt('5');
|
|
||||||
let b = BigInt('2');
|
|
||||||
let n = BigInt('19');
|
|
||||||
|
|
||||||
console.log(bigintCryptoUtils.modPow(a, b, n)); // prints 6
|
|
||||||
|
|
||||||
console.log(bigintCryptoUtils.modInv(BigInt('2'), BigInt('5'))); // prints 3
|
|
||||||
|
|
||||||
console.log(bigintCryptoUtils.modInv(BigInt('3'), BigInt('5'))); // prints 2
|
|
||||||
```
|
|
||||||
|
|
||||||
From a browser, you can just load the module in a html page as:
|
|
||||||
```html
|
|
||||||
<script type="module">
|
|
||||||
import * as bigintModArith from 'bigint-mod-arith-latest.browser.mod.min.js';
|
|
||||||
|
|
||||||
let a = BigInt('5');
|
|
||||||
let b = BigInt('2');
|
|
||||||
let n = BigInt('19');
|
|
||||||
|
|
||||||
console.log(bigintModArith.modPow(a, b, n)); // prints 6
|
|
||||||
|
|
||||||
console.log(bigintModArith.modInv(BigInt('2'), BigInt('5'))); // prints 3
|
|
||||||
|
|
||||||
console.log(bigintModArith.modInv(BigInt('3'), BigInt('5'))); // prints 2
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
# bigint-mod-arith JS Doc
|
|
||||||
|
|
||||||
{{>main}}
|
|
||||||
|
|
||||||
* * *
|
|
190
README.md
190
README.md
|
@ -1,105 +1,84 @@
|
||||||
|
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
|
||||||
|
|
||||||
# bigint-mod-arith
|
# bigint-mod-arith
|
||||||
|
|
||||||
Some extra functions to work with modular arithmetics using native JS (stage 3) implementation of BigInt. It can be used by any [Web Browser or webview supporting BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) and with Node.js (>=10.4.0).
|
Some extra functions to work with modular arithmetic using native JS ([ES-2020](https://tc39.es/ecma262/#sec-bigint-objects)) implementation of BigInt. It can be used by any [Web Browser or webview supporting BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) and with Node.js (>=10.4.0).
|
||||||
|
|
||||||
If you are looking for a cryptographically-secure random generator and for strong probable primes (generation and testing), you
|
> The operations supported on BigInts are not constant time. BigInt can be therefore **[unsuitable for use in cryptography](https://www.chosenplaintext.ca/articles/beginners-guide-constant-time-cryptography.html).** Many platforms provide native support for cryptography, such as [Web Cryptography API](https://w3c.github.io/webcrypto/) or [Node.js Crypto](https://nodejs.org/dist/latest/docs/api/crypto.html).
|
||||||
may be interested in [bigint-secrets](https://github.com/juanelas/bigint-secrets)
|
|
||||||
|
|
||||||
_The operations supported on BigInts are not constant time. BigInt can be therefore **[unsuitable for use in cryptography](https://www.chosenplaintext.ca/articles/beginners-guide-constant-time-cryptography.html).** Many platforms provide native support for cryptography, such as [Web Cryptography API](https://w3c.github.io/webcrypto/) or [Node.js Crypto](https://nodejs.org/dist/latest/docs/api/crypto.html)._
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
bigint-mod-arith is distributed for [web browsers and/or webviews supporting
|
|
||||||
BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility)
|
bigint-mod-arith is distributed for [web browsers and/or webviews supporting BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) as an ES6 module or an IIFE file; and for Node.js (>=10.4.0), as a CJS module.
|
||||||
as an ES6 module or an IIFE file; and for Node.js (>=10.4.0), as a CJS module.
|
|
||||||
|
|
||||||
bigint-mod-arith can be imported to your project with `npm`:
|
bigint-mod-arith can be imported to your project with `npm`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install bigint-mod-arith
|
npm install bigint-mod-arith
|
||||||
```
|
```
|
||||||
NPM installation defaults to the ES6 module for browsers and the CJS one for Node.js.
|
NPM installation defaults to the ES6 module for browsers and the CJS one for Node.js.
|
||||||
|
|
||||||
For web browsers, you can also directly download the minimised version of the [IIFE file](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bigint-mod-arith-latest.browser.min.js) or the [ES6 module](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/dist/bigint-mod-arith-latest.browser.mod.min.js) from GitHub.
|
For web browsers, you can also directly download the [IIFE bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/lib/index.browser.bundle.js) or the [ES6 bundle module](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/lib/index.browser.bundle.mod.js) from GitHub.
|
||||||
|
|
||||||
## Usage example
|
## Usage example
|
||||||
|
|
||||||
With node js:
|
Import your module as :
|
||||||
```javascript
|
|
||||||
const bigintModArith = require('bigint-mod-arith');
|
|
||||||
|
|
||||||
|
- Node.js
|
||||||
|
```javascript
|
||||||
|
const bigintCryptoUtils = require('bigint-mod-arith')
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
- JavaScript native project
|
||||||
|
```javascript
|
||||||
|
import * as bigintCryptoUtils from 'bigint-mod-arith'
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
- Javascript native browser ES6 mod
|
||||||
|
```html
|
||||||
|
<script type="module">
|
||||||
|
import * as bigintCryptoUtils from 'lib/index.browser.bundle.mod.js' // Use you actual path to the broser mod bundle
|
||||||
|
... // your code here
|
||||||
|
</script>
|
||||||
|
import as bcu from 'bigint-mod-arith'
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
- JavaScript native browser IIFE
|
||||||
|
```html
|
||||||
|
<script src="../../lib/index.browser.bundle.js"></script>
|
||||||
|
<script>
|
||||||
|
... // your code here
|
||||||
|
</script>
|
||||||
|
- TypeScript
|
||||||
|
```typescript
|
||||||
|
import * as bigintCryptoUtils from 'bigint-mod-arith'
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
> BigInt is [ES-2020](https://tc39.es/ecma262/#sec-bigint-objects). In order to use it with TypeScript you should set `lib` (and probably also `target` and `module`) to `esnext` in `tsconfig.json`.
|
||||||
|
|
||||||
|
```javascript
|
||||||
/* Stage 3 BigInts with value 666 can be declared as BigInt('666')
|
/* Stage 3 BigInts with value 666 can be declared as BigInt('666')
|
||||||
or the shorter new no-so-linter-friendly syntax 666n.
|
or the shorter new no-so-linter-friendly syntax 666n.
|
||||||
Notice that you can also pass a number, e.g. BigInt(666), but it is not
|
Notice that you can also pass a number, e.g. BigInt(666), but it is not
|
||||||
recommended since values over 2**53 - 1 won't be safe but no warning will
|
recommended since values over 2**53 - 1 won't be safe but no warning will
|
||||||
be raised.
|
be raised.
|
||||||
*/
|
*/
|
||||||
let a = BigInt('5');
|
const a = BigInt('5')
|
||||||
let b = BigInt('2');
|
const b = BigInt('2')
|
||||||
let n = BigInt('19');
|
const n = BigInt('19')
|
||||||
|
|
||||||
console.log(bigintCryptoUtils.modPow(a, b, n)); // prints 6
|
console.log(bigintCryptoUtils.modPow(a, b, n)) // prints 6
|
||||||
|
|
||||||
console.log(bigintCryptoUtils.modInv(BigInt('2'), BigInt('5'))); // prints 3
|
console.log(bigintCryptoUtils.modInv(BigInt('2'), BigInt('5'))) // prints 3
|
||||||
|
|
||||||
|
console.log(bigintCryptoUtils.modInv(BigInt('3'), BigInt('5'))) // prints 2
|
||||||
|
|
||||||
console.log(bigintCryptoUtils.modInv(BigInt('3'), BigInt('5'))); // prints 2
|
|
||||||
```
|
```
|
||||||
|
|
||||||
From a browser, you can just load the module in a html page as:
|
## JS Doc
|
||||||
```html
|
|
||||||
<script type="module">
|
|
||||||
import * as bigintModArith from 'bigint-mod-arith-latest.browser.mod.min.js';
|
|
||||||
|
|
||||||
let a = BigInt('5');
|
|
||||||
let b = BigInt('2');
|
|
||||||
let n = BigInt('19');
|
|
||||||
|
|
||||||
console.log(bigintModArith.modPow(a, b, n)); // prints 6
|
|
||||||
|
|
||||||
console.log(bigintModArith.modInv(BigInt('2'), BigInt('5'))); // prints 3
|
|
||||||
|
|
||||||
console.log(bigintModArith.modInv(BigInt('3'), BigInt('5'))); // prints 2
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
# bigint-mod-arith JS Doc
|
|
||||||
|
|
||||||
## Functions
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="#abs">abs(a)</a> ⇒ <code>bigint</code></dt>
|
|
||||||
<dd><p>Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0</p>
|
|
||||||
</dd>
|
|
||||||
<dt><a href="#eGcd">eGcd(a, b)</a> ⇒ <code><a href="#egcdReturn">egcdReturn</a></code></dt>
|
|
||||||
<dd><p>An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
|
||||||
Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).</p>
|
|
||||||
</dd>
|
|
||||||
<dt><a href="#gcd">gcd(a, b)</a> ⇒ <code>bigint</code></dt>
|
|
||||||
<dd><p>Greatest-common divisor of two integers based on the iterative binary algorithm.</p>
|
|
||||||
</dd>
|
|
||||||
<dt><a href="#lcm">lcm(a, b)</a> ⇒ <code>bigint</code></dt>
|
|
||||||
<dd><p>The least common multiple computed as abs(a*b)/gcd(a,b)</p>
|
|
||||||
</dd>
|
|
||||||
<dt><a href="#modInv">modInv(a, n)</a> ⇒ <code>bigint</code></dt>
|
|
||||||
<dd><p>Modular inverse.</p>
|
|
||||||
</dd>
|
|
||||||
<dt><a href="#modPow">modPow(a, b, n)</a> ⇒ <code>bigint</code></dt>
|
|
||||||
<dd><p>Modular exponentiation a**b mod n</p>
|
|
||||||
</dd>
|
|
||||||
<dt><a href="#toZn">toZn(a, n)</a> ⇒ <code>bigint</code></dt>
|
|
||||||
<dd><p>Finds the smallest positive element that is congruent to a in modulo n</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
## Typedefs
|
|
||||||
|
|
||||||
<dl>
|
|
||||||
<dt><a href="#egcdReturn">egcdReturn</a> : <code>Object</code></dt>
|
|
||||||
<dd><p>A triple (g, x, y), such that ax + by = g = gcd(a, b).</p>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
|
|
||||||
<a name="abs"></a>
|
<a name="abs"></a>
|
||||||
|
|
||||||
## abs(a) ⇒ <code>bigint</code>
|
### abs(a) ⇒ <code>bigint</code>
|
||||||
Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
||||||
|
|
||||||
**Kind**: global function
|
**Kind**: global function
|
||||||
|
@ -109,13 +88,26 @@ Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| a | <code>number</code> \| <code>bigint</code> |
|
| a | <code>number</code> \| <code>bigint</code> |
|
||||||
|
|
||||||
|
<a name="bitLength"></a>
|
||||||
|
|
||||||
|
### bitLength(a) ⇒ <code>number</code>
|
||||||
|
Returns the bitlength of a number
|
||||||
|
|
||||||
|
**Kind**: global function
|
||||||
|
**Returns**: <code>number</code> - - the bit length
|
||||||
|
|
||||||
|
| Param | Type |
|
||||||
|
| --- | --- |
|
||||||
|
| a | <code>number</code> \| <code>bigint</code> |
|
||||||
|
|
||||||
<a name="eGcd"></a>
|
<a name="eGcd"></a>
|
||||||
|
|
||||||
## eGcd(a, b) ⇒ [<code>egcdReturn</code>](#egcdReturn)
|
### eGcd(a, b) ⇒ [<code>egcdReturn</code>](#egcdReturn)
|
||||||
An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
||||||
Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
|
||||||
**Kind**: global function
|
**Kind**: global function
|
||||||
|
**Returns**: [<code>egcdReturn</code>](#egcdReturn) - A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
|
||||||
| Param | Type |
|
| Param | Type |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
@ -124,7 +116,7 @@ Take positive integers a, b as input, and return a triple (g, x, y), such that a
|
||||||
|
|
||||||
<a name="gcd"></a>
|
<a name="gcd"></a>
|
||||||
|
|
||||||
## gcd(a, b) ⇒ <code>bigint</code>
|
### gcd(a, b) ⇒ <code>bigint</code>
|
||||||
Greatest-common divisor of two integers based on the iterative binary algorithm.
|
Greatest-common divisor of two integers based on the iterative binary algorithm.
|
||||||
|
|
||||||
**Kind**: global function
|
**Kind**: global function
|
||||||
|
@ -137,7 +129,7 @@ Greatest-common divisor of two integers based on the iterative binary algorithm.
|
||||||
|
|
||||||
<a name="lcm"></a>
|
<a name="lcm"></a>
|
||||||
|
|
||||||
## lcm(a, b) ⇒ <code>bigint</code>
|
### lcm(a, b) ⇒ <code>bigint</code>
|
||||||
The least common multiple computed as abs(a*b)/gcd(a,b)
|
The least common multiple computed as abs(a*b)/gcd(a,b)
|
||||||
|
|
||||||
**Kind**: global function
|
**Kind**: global function
|
||||||
|
@ -148,13 +140,39 @@ The least common multiple computed as abs(a*b)/gcd(a,b)
|
||||||
| a | <code>number</code> \| <code>bigint</code> |
|
| a | <code>number</code> \| <code>bigint</code> |
|
||||||
| b | <code>number</code> \| <code>bigint</code> |
|
| b | <code>number</code> \| <code>bigint</code> |
|
||||||
|
|
||||||
|
<a name="max"></a>
|
||||||
|
|
||||||
|
### max(a, b) ⇒ <code>bigint</code>
|
||||||
|
Maximum. max(a,b)==a if a>=b. max(a,b)==b if a<=b
|
||||||
|
|
||||||
|
**Kind**: global function
|
||||||
|
**Returns**: <code>bigint</code> - maximum of numbers a and b
|
||||||
|
|
||||||
|
| Param | Type |
|
||||||
|
| --- | --- |
|
||||||
|
| a | <code>number</code> \| <code>bigint</code> |
|
||||||
|
| b | <code>number</code> \| <code>bigint</code> |
|
||||||
|
|
||||||
|
<a name="min"></a>
|
||||||
|
|
||||||
|
### min(a, b) ⇒ <code>bigint</code>
|
||||||
|
Minimum. min(a,b)==b if a>=b. min(a,b)==a if a<=b
|
||||||
|
|
||||||
|
**Kind**: global function
|
||||||
|
**Returns**: <code>bigint</code> - minimum of numbers a and b
|
||||||
|
|
||||||
|
| Param | Type |
|
||||||
|
| --- | --- |
|
||||||
|
| a | <code>number</code> \| <code>bigint</code> |
|
||||||
|
| b | <code>number</code> \| <code>bigint</code> |
|
||||||
|
|
||||||
<a name="modInv"></a>
|
<a name="modInv"></a>
|
||||||
|
|
||||||
## modInv(a, n) ⇒ <code>bigint</code>
|
### modInv(a, n) ⇒ <code>bigint</code>
|
||||||
Modular inverse.
|
Modular inverse.
|
||||||
|
|
||||||
**Kind**: global function
|
**Kind**: global function
|
||||||
**Returns**: <code>bigint</code> - the inverse modulo n
|
**Returns**: <code>bigint</code> - the inverse modulo n or NaN if it does not exist
|
||||||
|
|
||||||
| Param | Type | Description |
|
| Param | Type | Description |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
|
@ -163,21 +181,21 @@ Modular inverse.
|
||||||
|
|
||||||
<a name="modPow"></a>
|
<a name="modPow"></a>
|
||||||
|
|
||||||
## modPow(a, b, n) ⇒ <code>bigint</code>
|
### modPow(b, e, n) ⇒ <code>bigint</code>
|
||||||
Modular exponentiation a**b mod n
|
Modular exponentiation b**e mod n. Currently using the right-to-left binary method
|
||||||
|
|
||||||
**Kind**: global function
|
**Kind**: global function
|
||||||
**Returns**: <code>bigint</code> - a**b mod n
|
**Returns**: <code>bigint</code> - b**e mod n
|
||||||
|
|
||||||
| Param | Type | Description |
|
| Param | Type | Description |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| a | <code>number</code> \| <code>bigint</code> | base |
|
| b | <code>number</code> \| <code>bigint</code> | base |
|
||||||
| b | <code>number</code> \| <code>bigint</code> | exponent |
|
| e | <code>number</code> \| <code>bigint</code> | exponent |
|
||||||
| n | <code>number</code> \| <code>bigint</code> | modulo |
|
| n | <code>number</code> \| <code>bigint</code> | modulo |
|
||||||
|
|
||||||
<a name="toZn"></a>
|
<a name="toZn"></a>
|
||||||
|
|
||||||
## toZn(a, n) ⇒ <code>bigint</code>
|
### toZn(a, n) ⇒ <code>bigint</code>
|
||||||
Finds the smallest positive element that is congruent to a in modulo n
|
Finds the smallest positive element that is congruent to a in modulo n
|
||||||
|
|
||||||
**Kind**: global function
|
**Kind**: global function
|
||||||
|
@ -190,7 +208,7 @@ Finds the smallest positive element that is congruent to a in modulo n
|
||||||
|
|
||||||
<a name="egcdReturn"></a>
|
<a name="egcdReturn"></a>
|
||||||
|
|
||||||
## egcdReturn : <code>Object</code>
|
### egcdReturn : <code>Object</code>
|
||||||
A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
|
||||||
**Kind**: global typedef
|
**Kind**: global typedef
|
||||||
|
@ -202,5 +220,3 @@ A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
| x | <code>bigint</code> |
|
| x | <code>bigint</code> |
|
||||||
| y | <code>bigint</code> |
|
| y | <code>bigint</code> |
|
||||||
|
|
||||||
|
|
||||||
* * *
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
const fs = require('fs')
|
||||||
|
const ts = require('typescript')
|
||||||
|
const path = require('path')
|
||||||
|
const pkgJson = require('../package.json')
|
||||||
|
|
||||||
|
const rootDir = path.join(__dirname, '..')
|
||||||
|
const jsFile = path.join(rootDir, pkgJson.browser)
|
||||||
|
const dtsFile = path.join(rootDir, pkgJson.types)
|
||||||
|
|
||||||
|
const compilerOptions = {
|
||||||
|
declaration: true,
|
||||||
|
noEmit: false,
|
||||||
|
emitDeclarationOnly: true,
|
||||||
|
allowJs: true
|
||||||
|
}
|
||||||
|
|
||||||
|
const host = ts.createCompilerHost(compilerOptions)
|
||||||
|
|
||||||
|
host.writeFile = (fileName, contents) => {
|
||||||
|
fs.writeFileSync(dtsFile, contents)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare and emit the d.ts files
|
||||||
|
const program = ts.createProgram([jsFile], compilerOptions, host)
|
||||||
|
program.emit()
|
|
@ -1,102 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const rollup = require('rollup');
|
|
||||||
const minify = require('rollup-plugin-babel-minify');
|
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
const pkgJson = require('../package.json');
|
|
||||||
|
|
||||||
const rootDir = path.join(__dirname, '..');
|
|
||||||
const srcDir = path.join(rootDir, 'src');
|
|
||||||
const dstDir = path.join(rootDir, 'dist');
|
|
||||||
|
|
||||||
const buildOptions = [
|
|
||||||
{ // Browser
|
|
||||||
input: {
|
|
||||||
input: path.join(srcDir, 'main.js')
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
file: path.join(dstDir, `${pkgJson.name}-${pkgJson.version}.browser.js`),
|
|
||||||
format: 'iife',
|
|
||||||
name: camelise(pkgJson.name)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ // Browser minified
|
|
||||||
input: {
|
|
||||||
input: path.join(srcDir, 'main.js'),
|
|
||||||
plugins: [
|
|
||||||
minify({
|
|
||||||
'comments': false
|
|
||||||
})
|
|
||||||
],
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
file: path.join(dstDir, `${pkgJson.name}-${pkgJson.version}.browser.min.js`),
|
|
||||||
format: 'iife',
|
|
||||||
name: camelise(pkgJson.name)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ // Browser esm
|
|
||||||
input: {
|
|
||||||
input: path.join(srcDir, 'main.js')
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
file: path.join(dstDir, `${pkgJson.name}-${pkgJson.version}.browser.mod.js`),
|
|
||||||
format: 'esm'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ // Browser esm minified
|
|
||||||
input: {
|
|
||||||
input: path.join(srcDir, 'main.js'),
|
|
||||||
plugins: [
|
|
||||||
minify({
|
|
||||||
'comments': false
|
|
||||||
})
|
|
||||||
],
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
file: path.join(dstDir, `${pkgJson.name}-${pkgJson.version}.browser.mod.min.js`),
|
|
||||||
format: 'esm'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ // Node
|
|
||||||
input: {
|
|
||||||
input: path.join(srcDir, 'main.js'),
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
file: path.join(dstDir, `${pkgJson.name}-${pkgJson.version}.node.js`),
|
|
||||||
format: 'cjs'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
for (const options of buildOptions) {
|
|
||||||
build(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* --- HELPLER FUNCTIONS --- */
|
|
||||||
|
|
||||||
async function build(options) {
|
|
||||||
// create a bundle
|
|
||||||
const bundle = await rollup.rollup(options.input);
|
|
||||||
|
|
||||||
// generate code
|
|
||||||
await bundle.generate(options.output);
|
|
||||||
|
|
||||||
// or write the bundle to disk
|
|
||||||
await bundle.write(options.output);
|
|
||||||
|
|
||||||
// copy the latest build as pkg_name-latest
|
|
||||||
fs.copyFileSync(
|
|
||||||
options.output.file,
|
|
||||||
options.output.file.replace(`${pkgJson.name}-${pkgJson.version}.`, `${pkgJson.name}-latest.`)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function camelise(str) {
|
|
||||||
return str.replace(/-([a-z])/g,
|
|
||||||
function (m, w) {
|
|
||||||
return w.toUpperCase();
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const resolve = require('@rollup/plugin-node-resolve')
|
||||||
|
const replace = require('@rollup/plugin-replace')
|
||||||
|
const { terser } = require('rollup-plugin-terser')
|
||||||
|
|
||||||
|
const path = require('path')
|
||||||
|
const pkgJson = require('../package.json')
|
||||||
|
|
||||||
|
const rootDir = path.join(__dirname, '..')
|
||||||
|
const srcDir = path.join(rootDir, pkgJson.directories.src)
|
||||||
|
const dstDir = path.join(rootDir, pkgJson.directories.lib)
|
||||||
|
|
||||||
|
function camelise (str) {
|
||||||
|
console.log('camelise', str)
|
||||||
|
return str.replace(/-([a-z])/g,
|
||||||
|
function (m, w) {
|
||||||
|
return w.toUpperCase()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const pkgName = pkgJson.name
|
||||||
|
const pkgCamelisedName = camelise(pkgName)
|
||||||
|
|
||||||
|
const input = path.join(srcDir, 'js', 'index.js')
|
||||||
|
|
||||||
|
module.exports = [
|
||||||
|
{ // ESM native module
|
||||||
|
input: input,
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
file: path.join(dstDir, 'index.browser.mod.js'),
|
||||||
|
format: 'esm'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
replace({
|
||||||
|
'process.browser': true
|
||||||
|
})
|
||||||
|
]
|
||||||
|
// external: ['bigint-crypto-utils']
|
||||||
|
},
|
||||||
|
{ // Browser bundles
|
||||||
|
input: input,
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
file: path.join(dstDir, 'index.browser.bundle.js'),
|
||||||
|
format: 'iife',
|
||||||
|
name: pkgCamelisedName
|
||||||
|
},
|
||||||
|
{
|
||||||
|
file: path.join(dstDir, 'index.browser.bundle.mod.js'),
|
||||||
|
format: 'es'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
replace({
|
||||||
|
'process.browser': true
|
||||||
|
}),
|
||||||
|
resolve({
|
||||||
|
browser: true
|
||||||
|
}),
|
||||||
|
terser({
|
||||||
|
mangle: false,
|
||||||
|
compress: false
|
||||||
|
})
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ // Node
|
||||||
|
input: input,
|
||||||
|
plugins: [
|
||||||
|
replace({
|
||||||
|
'process.browser': false
|
||||||
|
})
|
||||||
|
],
|
||||||
|
output: {
|
||||||
|
file: path.join(dstDir, 'index.node.js'),
|
||||||
|
format: 'cjs'
|
||||||
|
}
|
||||||
|
// external: ['bigint-crypto-utils']
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,62 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
const resolve = require('@rollup/plugin-node-resolve')
|
||||||
|
const replace = require('@rollup/plugin-replace')
|
||||||
|
const commonjs = require('@rollup/plugin-commonjs')
|
||||||
|
const multi = require('@rollup/plugin-multi-entry')
|
||||||
|
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
const pkgJson = require('../package.json')
|
||||||
|
const pkgJsonLock = require('../package-lock.json')
|
||||||
|
const mochaVersion = pkgJsonLock.dependencies.mocha.version
|
||||||
|
const chaiVersion = pkgJsonLock.dependencies.chai.version
|
||||||
|
const pkgName = pkgJson.name
|
||||||
|
|
||||||
|
const rootDir = path.join(__dirname, '..')
|
||||||
|
|
||||||
|
// Let's first create the appropriate html file loading mocha, chai and a bundle of the tests
|
||||||
|
const templatePath = path.join(rootDir, pkgJson.directories.src, 'browser', 'tests-template.html')
|
||||||
|
const dstDir = path.join(rootDir, pkgJson.directories.test, 'browser')
|
||||||
|
const dstFileName = path.join(dstDir, 'index.html')
|
||||||
|
|
||||||
|
const template = fs.readFileSync(templatePath, 'utf-8')
|
||||||
|
const bundleFile = path.join(rootDir, pkgJson.directories.lib, 'index.browser.bundle.mod.js')
|
||||||
|
const testsJs = `
|
||||||
|
<script type="module">
|
||||||
|
import * as _pkg from '${path.relative(templatePath, bundleFile)}'
|
||||||
|
window._pkg = _pkg;
|
||||||
|
import './tests.js';
|
||||||
|
mocha.run();
|
||||||
|
</script>`
|
||||||
|
|
||||||
|
fs.writeFileSync(dstFileName,
|
||||||
|
template.replace(/{{TESTS}}/g, testsJs).replace(/{{PKG_NAME}}/g, pkgName).replace(/{{MOCHA_VERSION}}/g, mochaVersion).replace(/{{CHAI_VERSION}}/g, chaiVersion)
|
||||||
|
)
|
||||||
|
|
||||||
|
const input = path.join(rootDir, pkgJson.directories.test, '*.js')
|
||||||
|
console.log(input)
|
||||||
|
|
||||||
|
module.exports = [
|
||||||
|
{
|
||||||
|
input: input,
|
||||||
|
plugins: [
|
||||||
|
multi({ exports: false }),
|
||||||
|
replace({
|
||||||
|
'const _pkg = require(\'../lib/index.node\')': '',
|
||||||
|
'const chai = require(\'chai\')': '',
|
||||||
|
delimiters: ['', ''],
|
||||||
|
'process.browser': true
|
||||||
|
}),
|
||||||
|
resolve({
|
||||||
|
browser: true
|
||||||
|
}),
|
||||||
|
commonjs()
|
||||||
|
],
|
||||||
|
output: {
|
||||||
|
file: path.join(rootDir, pkgJson.directories.test, 'browser', 'tests.js'),
|
||||||
|
format: 'esm'
|
||||||
|
},
|
||||||
|
external: [pkgName]
|
||||||
|
}
|
||||||
|
]
|
|
@ -1,178 +0,0 @@
|
||||||
var bigintModArith = (function (exports) {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const _ZERO = BigInt(0);
|
|
||||||
const _ONE = BigInt(1);
|
|
||||||
const _TWO = BigInt(2);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
*
|
|
||||||
* @returns {bigint} the absolute value of a
|
|
||||||
*/
|
|
||||||
function abs(a) {
|
|
||||||
a = BigInt(a);
|
|
||||||
return (a >= _ZERO) ? a : -a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
* @property {bigint} g
|
|
||||||
* @property {bigint} x
|
|
||||||
* @property {bigint} y
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
|
||||||
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {egcdReturn}
|
|
||||||
*/
|
|
||||||
function eGcd(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
let x = _ZERO;
|
|
||||||
let y = _ONE;
|
|
||||||
let u = _ONE;
|
|
||||||
let v = _ZERO;
|
|
||||||
|
|
||||||
while (a !== _ZERO) {
|
|
||||||
let q = b / a;
|
|
||||||
let r = b % a;
|
|
||||||
let m = x - (u * q);
|
|
||||||
let n = y - (v * q);
|
|
||||||
b = a;
|
|
||||||
a = r;
|
|
||||||
x = u;
|
|
||||||
y = v;
|
|
||||||
u = m;
|
|
||||||
v = n;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
b: b,
|
|
||||||
x: x,
|
|
||||||
y: y
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The greatest common divisor of a and b
|
|
||||||
*/
|
|
||||||
function gcd(a, b) {
|
|
||||||
a = abs(a);
|
|
||||||
b = abs(b);
|
|
||||||
let shift = _ZERO;
|
|
||||||
while (!((a | b) & _ONE)) {
|
|
||||||
a >>= _ONE;
|
|
||||||
b >>= _ONE;
|
|
||||||
shift++;
|
|
||||||
}
|
|
||||||
while (!(a & _ONE)) a >>= _ONE;
|
|
||||||
do {
|
|
||||||
while (!(b & _ONE)) b >>= _ONE;
|
|
||||||
if (a > b) {
|
|
||||||
let x = a;
|
|
||||||
a = b;
|
|
||||||
b = x;
|
|
||||||
}
|
|
||||||
b -= a;
|
|
||||||
} while (b);
|
|
||||||
|
|
||||||
// rescale
|
|
||||||
return a << shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The least common multiple of a and b
|
|
||||||
*/
|
|
||||||
function lcm(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
return abs(a * b) / gcd(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular inverse.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a The number to find an inverse for
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} the inverse modulo n
|
|
||||||
*/
|
|
||||||
function modInv(a, n) {
|
|
||||||
let egcd = eGcd(a, n);
|
|
||||||
if (egcd.b !== _ONE) {
|
|
||||||
return null; // modular inverse does not exist
|
|
||||||
} else {
|
|
||||||
return toZn(egcd.x, n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular exponentiation a**b mod n
|
|
||||||
* @param {number|bigint} a base
|
|
||||||
* @param {number|bigint} b exponent
|
|
||||||
* @param {number|bigint} n modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} a**b mod n
|
|
||||||
*/
|
|
||||||
function modPow(a, b, n) {
|
|
||||||
// See Knuth, volume 2, section 4.6.3.
|
|
||||||
n = BigInt(n);
|
|
||||||
a = toZn(a, n);
|
|
||||||
b = BigInt(b);
|
|
||||||
if (b < _ZERO) {
|
|
||||||
return modInv(modPow(a, abs(b), n), n);
|
|
||||||
}
|
|
||||||
let result = _ONE;
|
|
||||||
let x = a;
|
|
||||||
while (b > 0) {
|
|
||||||
var leastSignificantBit = b % _TWO;
|
|
||||||
b = b / _TWO;
|
|
||||||
if (leastSignificantBit == _ONE) {
|
|
||||||
result = result * x;
|
|
||||||
result = result % n;
|
|
||||||
}
|
|
||||||
x = x * x;
|
|
||||||
x = x % n;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the smallest positive element that is congruent to a in modulo n
|
|
||||||
* @param {number|bigint} a An integer
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} The smallest positive representation of a in modulo n
|
|
||||||
*/
|
|
||||||
function toZn(a, n) {
|
|
||||||
n = BigInt(n);
|
|
||||||
a = BigInt(a) % n;
|
|
||||||
return (a < 0) ? a + n : a;
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.abs = abs;
|
|
||||||
exports.eGcd = eGcd;
|
|
||||||
exports.gcd = gcd;
|
|
||||||
exports.lcm = lcm;
|
|
||||||
exports.modInv = modInv;
|
|
||||||
exports.modPow = modPow;
|
|
||||||
exports.toZn = toZn;
|
|
||||||
|
|
||||||
return exports;
|
|
||||||
|
|
||||||
}({}));
|
|
|
@ -1 +0,0 @@
|
||||||
var bigintModArith=function(a){'use strict';function c(b){return b=BigInt(b),b>=i?b:-b}function d(c,d){c=BigInt(c),d=BigInt(d);let e=i,f=j,g=j,h=i;for(;c!==i;){let a=d/c,b=d%c,i=e-g*a,j=f-h*a;d=c,c=b,e=g,f=h,g=i,h=j}return{b:d,x:e,y:f}}function e(d,e){d=c(d),e=c(e);let f=i;for(;!((d|e)&j);)d>>=j,e>>=j,f++;for(;!(d&j);)d>>=j;do{for(;!(e&j);)e>>=j;if(d>e){let a=d;d=e,e=a}e-=d}while(e);return d<<f}function f(b,a){let c=d(b,a);return c.b===j?h(c.x,a):null}function g(d,e,l){if(l=BigInt(l),d=h(d,l),e=BigInt(e),e<i)return f(g(d,c(e),l),l);let m=j,o=d;for(;0<e;){var p=e%k;e/=k,p==j&&(m*=o,m%=l),o*=o,o%=l}return m}function h(b,c){return c=BigInt(c),b=BigInt(b)%c,0>b?b+c:b}const i=BigInt(0),j=BigInt(1),k=BigInt(2);return a.abs=c,a.eGcd=d,a.gcd=e,a.lcm=function(d,f){return d=BigInt(d),f=BigInt(f),c(d*f)/e(d,f)},a.modInv=f,a.modPow=g,a.toZn=h,a}({});
|
|
|
@ -1,165 +0,0 @@
|
||||||
const _ZERO = BigInt(0);
|
|
||||||
const _ONE = BigInt(1);
|
|
||||||
const _TWO = BigInt(2);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
*
|
|
||||||
* @returns {bigint} the absolute value of a
|
|
||||||
*/
|
|
||||||
function abs(a) {
|
|
||||||
a = BigInt(a);
|
|
||||||
return (a >= _ZERO) ? a : -a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
* @property {bigint} g
|
|
||||||
* @property {bigint} x
|
|
||||||
* @property {bigint} y
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
|
||||||
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {egcdReturn}
|
|
||||||
*/
|
|
||||||
function eGcd(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
let x = _ZERO;
|
|
||||||
let y = _ONE;
|
|
||||||
let u = _ONE;
|
|
||||||
let v = _ZERO;
|
|
||||||
|
|
||||||
while (a !== _ZERO) {
|
|
||||||
let q = b / a;
|
|
||||||
let r = b % a;
|
|
||||||
let m = x - (u * q);
|
|
||||||
let n = y - (v * q);
|
|
||||||
b = a;
|
|
||||||
a = r;
|
|
||||||
x = u;
|
|
||||||
y = v;
|
|
||||||
u = m;
|
|
||||||
v = n;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
b: b,
|
|
||||||
x: x,
|
|
||||||
y: y
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The greatest common divisor of a and b
|
|
||||||
*/
|
|
||||||
function gcd(a, b) {
|
|
||||||
a = abs(a);
|
|
||||||
b = abs(b);
|
|
||||||
let shift = _ZERO;
|
|
||||||
while (!((a | b) & _ONE)) {
|
|
||||||
a >>= _ONE;
|
|
||||||
b >>= _ONE;
|
|
||||||
shift++;
|
|
||||||
}
|
|
||||||
while (!(a & _ONE)) a >>= _ONE;
|
|
||||||
do {
|
|
||||||
while (!(b & _ONE)) b >>= _ONE;
|
|
||||||
if (a > b) {
|
|
||||||
let x = a;
|
|
||||||
a = b;
|
|
||||||
b = x;
|
|
||||||
}
|
|
||||||
b -= a;
|
|
||||||
} while (b);
|
|
||||||
|
|
||||||
// rescale
|
|
||||||
return a << shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The least common multiple of a and b
|
|
||||||
*/
|
|
||||||
function lcm(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
return abs(a * b) / gcd(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular inverse.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a The number to find an inverse for
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} the inverse modulo n
|
|
||||||
*/
|
|
||||||
function modInv(a, n) {
|
|
||||||
let egcd = eGcd(a, n);
|
|
||||||
if (egcd.b !== _ONE) {
|
|
||||||
return null; // modular inverse does not exist
|
|
||||||
} else {
|
|
||||||
return toZn(egcd.x, n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular exponentiation a**b mod n
|
|
||||||
* @param {number|bigint} a base
|
|
||||||
* @param {number|bigint} b exponent
|
|
||||||
* @param {number|bigint} n modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} a**b mod n
|
|
||||||
*/
|
|
||||||
function modPow(a, b, n) {
|
|
||||||
// See Knuth, volume 2, section 4.6.3.
|
|
||||||
n = BigInt(n);
|
|
||||||
a = toZn(a, n);
|
|
||||||
b = BigInt(b);
|
|
||||||
if (b < _ZERO) {
|
|
||||||
return modInv(modPow(a, abs(b), n), n);
|
|
||||||
}
|
|
||||||
let result = _ONE;
|
|
||||||
let x = a;
|
|
||||||
while (b > 0) {
|
|
||||||
var leastSignificantBit = b % _TWO;
|
|
||||||
b = b / _TWO;
|
|
||||||
if (leastSignificantBit == _ONE) {
|
|
||||||
result = result * x;
|
|
||||||
result = result % n;
|
|
||||||
}
|
|
||||||
x = x * x;
|
|
||||||
x = x % n;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the smallest positive element that is congruent to a in modulo n
|
|
||||||
* @param {number|bigint} a An integer
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} The smallest positive representation of a in modulo n
|
|
||||||
*/
|
|
||||||
function toZn(a, n) {
|
|
||||||
n = BigInt(n);
|
|
||||||
a = BigInt(a) % n;
|
|
||||||
return (a < 0) ? a + n : a;
|
|
||||||
}
|
|
||||||
|
|
||||||
export { abs, eGcd, gcd, lcm, modInv, modPow, toZn };
|
|
|
@ -1 +0,0 @@
|
||||||
const _ZERO=BigInt(0),_ONE=BigInt(1),_TWO=BigInt(2);function abs(b){return b=BigInt(b),b>=_ZERO?b:-b}function eGcd(c,d){c=BigInt(c),d=BigInt(d);let e=_ZERO,f=_ONE,g=_ONE,h=_ZERO;for(;c!==_ZERO;){let a=d/c,b=d%c,i=e-g*a,j=f-h*a;d=c,c=b,e=g,f=h,g=i,h=j}return{b:d,x:e,y:f}}function gcd(c,d){c=abs(c),d=abs(d);let e=_ZERO;for(;!((c|d)&_ONE);)c>>=_ONE,d>>=_ONE,e++;for(;!(c&_ONE);)c>>=_ONE;do{for(;!(d&_ONE);)d>>=_ONE;if(c>d){let a=c;c=d,d=a}d-=c}while(d);return c<<e}function lcm(c,d){return c=BigInt(c),d=BigInt(d),abs(c*d)/gcd(c,d)}function modInv(b,a){let c=eGcd(b,a);return c.b===_ONE?toZn(c.x,a):null}function modPow(c,d,e){if(e=BigInt(e),c=toZn(c,e),d=BigInt(d),d<_ZERO)return modInv(modPow(c,abs(d),e),e);let f=_ONE,g=c;for(;0<d;){var h=d%_TWO;d/=_TWO,h==_ONE&&(f*=g,f%=e),g*=g,g%=e}return f}function toZn(b,c){return c=BigInt(c),b=BigInt(b)%c,0>b?b+c:b}export{abs,eGcd,gcd,lcm,modInv,modPow,toZn};
|
|
|
@ -1,175 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
const _ZERO = BigInt(0);
|
|
||||||
const _ONE = BigInt(1);
|
|
||||||
const _TWO = BigInt(2);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
*
|
|
||||||
* @returns {bigint} the absolute value of a
|
|
||||||
*/
|
|
||||||
function abs(a) {
|
|
||||||
a = BigInt(a);
|
|
||||||
return (a >= _ZERO) ? a : -a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
* @property {bigint} g
|
|
||||||
* @property {bigint} x
|
|
||||||
* @property {bigint} y
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
|
||||||
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {egcdReturn}
|
|
||||||
*/
|
|
||||||
function eGcd(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
let x = _ZERO;
|
|
||||||
let y = _ONE;
|
|
||||||
let u = _ONE;
|
|
||||||
let v = _ZERO;
|
|
||||||
|
|
||||||
while (a !== _ZERO) {
|
|
||||||
let q = b / a;
|
|
||||||
let r = b % a;
|
|
||||||
let m = x - (u * q);
|
|
||||||
let n = y - (v * q);
|
|
||||||
b = a;
|
|
||||||
a = r;
|
|
||||||
x = u;
|
|
||||||
y = v;
|
|
||||||
u = m;
|
|
||||||
v = n;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
b: b,
|
|
||||||
x: x,
|
|
||||||
y: y
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The greatest common divisor of a and b
|
|
||||||
*/
|
|
||||||
function gcd(a, b) {
|
|
||||||
a = abs(a);
|
|
||||||
b = abs(b);
|
|
||||||
let shift = _ZERO;
|
|
||||||
while (!((a | b) & _ONE)) {
|
|
||||||
a >>= _ONE;
|
|
||||||
b >>= _ONE;
|
|
||||||
shift++;
|
|
||||||
}
|
|
||||||
while (!(a & _ONE)) a >>= _ONE;
|
|
||||||
do {
|
|
||||||
while (!(b & _ONE)) b >>= _ONE;
|
|
||||||
if (a > b) {
|
|
||||||
let x = a;
|
|
||||||
a = b;
|
|
||||||
b = x;
|
|
||||||
}
|
|
||||||
b -= a;
|
|
||||||
} while (b);
|
|
||||||
|
|
||||||
// rescale
|
|
||||||
return a << shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The least common multiple of a and b
|
|
||||||
*/
|
|
||||||
function lcm(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
return abs(a * b) / gcd(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular inverse.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a The number to find an inverse for
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} the inverse modulo n
|
|
||||||
*/
|
|
||||||
function modInv(a, n) {
|
|
||||||
let egcd = eGcd(a, n);
|
|
||||||
if (egcd.b !== _ONE) {
|
|
||||||
return null; // modular inverse does not exist
|
|
||||||
} else {
|
|
||||||
return toZn(egcd.x, n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular exponentiation a**b mod n
|
|
||||||
* @param {number|bigint} a base
|
|
||||||
* @param {number|bigint} b exponent
|
|
||||||
* @param {number|bigint} n modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} a**b mod n
|
|
||||||
*/
|
|
||||||
function modPow(a, b, n) {
|
|
||||||
// See Knuth, volume 2, section 4.6.3.
|
|
||||||
n = BigInt(n);
|
|
||||||
a = toZn(a, n);
|
|
||||||
b = BigInt(b);
|
|
||||||
if (b < _ZERO) {
|
|
||||||
return modInv(modPow(a, abs(b), n), n);
|
|
||||||
}
|
|
||||||
let result = _ONE;
|
|
||||||
let x = a;
|
|
||||||
while (b > 0) {
|
|
||||||
var leastSignificantBit = b % _TWO;
|
|
||||||
b = b / _TWO;
|
|
||||||
if (leastSignificantBit == _ONE) {
|
|
||||||
result = result * x;
|
|
||||||
result = result % n;
|
|
||||||
}
|
|
||||||
x = x * x;
|
|
||||||
x = x % n;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the smallest positive element that is congruent to a in modulo n
|
|
||||||
* @param {number|bigint} a An integer
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} The smallest positive representation of a in modulo n
|
|
||||||
*/
|
|
||||||
function toZn(a, n) {
|
|
||||||
n = BigInt(n);
|
|
||||||
a = BigInt(a) % n;
|
|
||||||
return (a < 0) ? a + n : a;
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.abs = abs;
|
|
||||||
exports.eGcd = eGcd;
|
|
||||||
exports.gcd = gcd;
|
|
||||||
exports.lcm = lcm;
|
|
||||||
exports.modInv = modInv;
|
|
||||||
exports.modPow = modPow;
|
|
||||||
exports.toZn = toZn;
|
|
|
@ -0,0 +1 @@
|
||||||
|
var bigintModArith=function(exports){"use strict";const _ZERO=BigInt(0);const _ONE=BigInt(1);const _TWO=BigInt(2);function abs(a){a=BigInt(a);return a>=_ZERO?a:-a}function bitLength(a){a=BigInt(a);if(a===_ONE){return 1}let bits=1;do{bits++}while((a>>=_ONE)>_ONE);return bits}function eGcd(a,b){a=BigInt(a);b=BigInt(b);if(a<=_ZERO|b<=_ZERO){return NaN}let x=_ZERO;let y=_ONE;let u=_ONE;let v=_ZERO;while(a!==_ZERO){const q=b/a;const r=b%a;const m=x-u*q;const n=y-v*q;b=a;a=r;x=u;y=v;u=m;v=n}return{b:b,x:x,y:y}}function gcd(a,b){a=abs(a);b=abs(b);if(a===_ZERO){return b}else if(b===_ZERO){return a}let shift=_ZERO;while(!((a|b)&_ONE)){a>>=_ONE;b>>=_ONE;shift++}while(!(a&_ONE))a>>=_ONE;do{while(!(b&_ONE))b>>=_ONE;if(a>b){const x=a;a=b;b=x}b-=a}while(b);return a<<shift}function lcm(a,b){a=BigInt(a);b=BigInt(b);if(a===_ZERO&&b===_ZERO){return _ZERO}return abs(a*b)/gcd(a,b)}function max(a,b){a=BigInt(a);b=BigInt(b);return a>=b?a:b}function min(a,b){a=BigInt(a);b=BigInt(b);return a>=b?b:a}function modInv(a,n){const egcd=eGcd(toZn(a,n),n);if(egcd.b!==_ONE){return NaN}else{return toZn(egcd.x,n)}}function modPow(b,e,n){n=BigInt(n);if(n===_ZERO){return NaN}else if(n===_ONE){return _ZERO}b=toZn(b,n);e=BigInt(e);if(e<_ZERO){return modInv(modPow(b,abs(e),n),n)}let r=_ONE;while(e>0){if(e%_TWO===_ONE){r=r*b%n}e=e/_TWO;b=b**_TWO%n}return r}function toZn(a,n){n=BigInt(n);if(n<=0){return NaN}a=BigInt(a)%n;return a<0?a+n:a}exports.abs=abs;exports.bitLength=bitLength;exports.eGcd=eGcd;exports.gcd=gcd;exports.lcm=lcm;exports.max=max;exports.min=min;exports.modInv=modInv;exports.modPow=modPow;exports.toZn=toZn;return exports}({});
|
|
@ -0,0 +1 @@
|
||||||
|
const _ZERO=BigInt(0);const _ONE=BigInt(1);const _TWO=BigInt(2);function abs(a){a=BigInt(a);return a>=_ZERO?a:-a}function bitLength(a){a=BigInt(a);if(a===_ONE){return 1}let bits=1;do{bits++}while((a>>=_ONE)>_ONE);return bits}function eGcd(a,b){a=BigInt(a);b=BigInt(b);if(a<=_ZERO|b<=_ZERO){return NaN}let x=_ZERO;let y=_ONE;let u=_ONE;let v=_ZERO;while(a!==_ZERO){const q=b/a;const r=b%a;const m=x-u*q;const n=y-v*q;b=a;a=r;x=u;y=v;u=m;v=n}return{b:b,x:x,y:y}}function gcd(a,b){a=abs(a);b=abs(b);if(a===_ZERO){return b}else if(b===_ZERO){return a}let shift=_ZERO;while(!((a|b)&_ONE)){a>>=_ONE;b>>=_ONE;shift++}while(!(a&_ONE))a>>=_ONE;do{while(!(b&_ONE))b>>=_ONE;if(a>b){const x=a;a=b;b=x}b-=a}while(b);return a<<shift}function lcm(a,b){a=BigInt(a);b=BigInt(b);if(a===_ZERO&&b===_ZERO){return _ZERO}return abs(a*b)/gcd(a,b)}function max(a,b){a=BigInt(a);b=BigInt(b);return a>=b?a:b}function min(a,b){a=BigInt(a);b=BigInt(b);return a>=b?b:a}function modInv(a,n){const egcd=eGcd(toZn(a,n),n);if(egcd.b!==_ONE){return NaN}else{return toZn(egcd.x,n)}}function modPow(b,e,n){n=BigInt(n);if(n===_ZERO){return NaN}else if(n===_ONE){return _ZERO}b=toZn(b,n);e=BigInt(e);if(e<_ZERO){return modInv(modPow(b,abs(e),n),n)}let r=_ONE;while(e>0){if(e%_TWO===_ONE){r=r*b%n}e=e/_TWO;b=b**_TWO%n}return r}function toZn(a,n){n=BigInt(n);if(n<=0){return NaN}a=BigInt(a)%n;return a<0?a+n:a}export{abs,bitLength,eGcd,gcd,lcm,max,min,modInv,modPow,toZn};
|
|
@ -0,0 +1,216 @@
|
||||||
|
const _ZERO = BigInt(0)
|
||||||
|
const _ONE = BigInt(1)
|
||||||
|
const _TWO = BigInt(2)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
*
|
||||||
|
* @returns {bigint} the absolute value of a
|
||||||
|
*/
|
||||||
|
function abs (a) {
|
||||||
|
a = BigInt(a)
|
||||||
|
return (a >= _ZERO) ? a : -a
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the bitlength of a number
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @returns {number} - the bit length
|
||||||
|
*/
|
||||||
|
function bitLength (a) {
|
||||||
|
a = BigInt(a)
|
||||||
|
if (a === _ONE) { return 1 }
|
||||||
|
let bits = 1
|
||||||
|
do {
|
||||||
|
bits++
|
||||||
|
} while ((a >>= _ONE) > _ONE)
|
||||||
|
return bits
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
* @property {bigint} g
|
||||||
|
* @property {bigint} x
|
||||||
|
* @property {bigint} y
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
||||||
|
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {egcdReturn} A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*/
|
||||||
|
function eGcd (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
if (a <= _ZERO | b <= _ZERO) { return NaN } // a and b MUST be positive
|
||||||
|
|
||||||
|
let x = _ZERO
|
||||||
|
let y = _ONE
|
||||||
|
let u = _ONE
|
||||||
|
let v = _ZERO
|
||||||
|
|
||||||
|
while (a !== _ZERO) {
|
||||||
|
const q = b / a
|
||||||
|
const r = b % a
|
||||||
|
const m = x - (u * q)
|
||||||
|
const n = y - (v * q)
|
||||||
|
b = a
|
||||||
|
a = r
|
||||||
|
x = u
|
||||||
|
y = v
|
||||||
|
u = m
|
||||||
|
v = n
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
b: b,
|
||||||
|
x: x,
|
||||||
|
y: y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The greatest common divisor of a and b
|
||||||
|
*/
|
||||||
|
function gcd (a, b) {
|
||||||
|
a = abs(a)
|
||||||
|
b = abs(b)
|
||||||
|
if (a === _ZERO) { return b } else if (b === _ZERO) { return a }
|
||||||
|
|
||||||
|
let shift = _ZERO
|
||||||
|
while (!((a | b) & _ONE)) {
|
||||||
|
a >>= _ONE
|
||||||
|
b >>= _ONE
|
||||||
|
shift++
|
||||||
|
}
|
||||||
|
while (!(a & _ONE)) a >>= _ONE
|
||||||
|
do {
|
||||||
|
while (!(b & _ONE)) b >>= _ONE
|
||||||
|
if (a > b) {
|
||||||
|
const x = a
|
||||||
|
a = b
|
||||||
|
b = x
|
||||||
|
}
|
||||||
|
b -= a
|
||||||
|
} while (b)
|
||||||
|
|
||||||
|
// rescale
|
||||||
|
return a << shift
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The least common multiple of a and b
|
||||||
|
*/
|
||||||
|
function lcm (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
if (a === _ZERO && b === _ZERO) { return _ZERO }
|
||||||
|
return abs(a * b) / gcd(a, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum. max(a,b)==a if a>=b. max(a,b)==b if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} maximum of numbers a and b
|
||||||
|
*/
|
||||||
|
function max (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
return (a >= b) ? a : b
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum. min(a,b)==b if a>=b. min(a,b)==a if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} minimum of numbers a and b
|
||||||
|
*/
|
||||||
|
function min (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
return (a >= b) ? b : a
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modular inverse.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a The number to find an inverse for
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} the inverse modulo n or NaN if it does not exist
|
||||||
|
*/
|
||||||
|
function modInv (a, n) {
|
||||||
|
const egcd = eGcd(toZn(a, n), n)
|
||||||
|
if (egcd.b !== _ONE) {
|
||||||
|
return NaN // modular inverse does not exist
|
||||||
|
} else {
|
||||||
|
return toZn(egcd.x, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modular exponentiation b**e mod n. Currently using the right-to-left binary method
|
||||||
|
*
|
||||||
|
* @param {number|bigint} b base
|
||||||
|
* @param {number|bigint} e exponent
|
||||||
|
* @param {number|bigint} n modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} b**e mod n
|
||||||
|
*/
|
||||||
|
function modPow (b, e, n) {
|
||||||
|
n = BigInt(n)
|
||||||
|
if (n === _ZERO) { return NaN } else if (n === _ONE) { return _ZERO }
|
||||||
|
|
||||||
|
b = toZn(b, n)
|
||||||
|
|
||||||
|
e = BigInt(e)
|
||||||
|
if (e < _ZERO) {
|
||||||
|
return modInv(modPow(b, abs(e), n), n)
|
||||||
|
}
|
||||||
|
|
||||||
|
let r = _ONE
|
||||||
|
while (e > 0) {
|
||||||
|
if ((e % _TWO) === _ONE) {
|
||||||
|
r = (r * b) % n
|
||||||
|
}
|
||||||
|
e = e / _TWO
|
||||||
|
b = b ** _TWO % n
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the smallest positive element that is congruent to a in modulo n
|
||||||
|
* @param {number|bigint} a An integer
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} The smallest positive representation of a in modulo n
|
||||||
|
*/
|
||||||
|
function toZn (a, n) {
|
||||||
|
n = BigInt(n)
|
||||||
|
if (n <= 0) { return NaN }
|
||||||
|
|
||||||
|
a = BigInt(a) % n
|
||||||
|
return (a < 0) ? a + n : a
|
||||||
|
}
|
||||||
|
|
||||||
|
export { abs, bitLength, eGcd, gcd, lcm, max, min, modInv, modPow, toZn }
|
|
@ -0,0 +1,229 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true })
|
||||||
|
|
||||||
|
const _ZERO = BigInt(0)
|
||||||
|
const _ONE = BigInt(1)
|
||||||
|
const _TWO = BigInt(2)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
*
|
||||||
|
* @returns {bigint} the absolute value of a
|
||||||
|
*/
|
||||||
|
function abs (a) {
|
||||||
|
a = BigInt(a)
|
||||||
|
return (a >= _ZERO) ? a : -a
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the bitlength of a number
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @returns {number} - the bit length
|
||||||
|
*/
|
||||||
|
function bitLength (a) {
|
||||||
|
a = BigInt(a)
|
||||||
|
if (a === _ONE) { return 1 }
|
||||||
|
let bits = 1
|
||||||
|
do {
|
||||||
|
bits++
|
||||||
|
} while ((a >>= _ONE) > _ONE)
|
||||||
|
return bits
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
* @property {bigint} g
|
||||||
|
* @property {bigint} x
|
||||||
|
* @property {bigint} y
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
||||||
|
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {egcdReturn} A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*/
|
||||||
|
function eGcd (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
if (a <= _ZERO | b <= _ZERO) { return NaN } // a and b MUST be positive
|
||||||
|
|
||||||
|
let x = _ZERO
|
||||||
|
let y = _ONE
|
||||||
|
let u = _ONE
|
||||||
|
let v = _ZERO
|
||||||
|
|
||||||
|
while (a !== _ZERO) {
|
||||||
|
const q = b / a
|
||||||
|
const r = b % a
|
||||||
|
const m = x - (u * q)
|
||||||
|
const n = y - (v * q)
|
||||||
|
b = a
|
||||||
|
a = r
|
||||||
|
x = u
|
||||||
|
y = v
|
||||||
|
u = m
|
||||||
|
v = n
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
b: b,
|
||||||
|
x: x,
|
||||||
|
y: y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The greatest common divisor of a and b
|
||||||
|
*/
|
||||||
|
function gcd (a, b) {
|
||||||
|
a = abs(a)
|
||||||
|
b = abs(b)
|
||||||
|
if (a === _ZERO) { return b } else if (b === _ZERO) { return a }
|
||||||
|
|
||||||
|
let shift = _ZERO
|
||||||
|
while (!((a | b) & _ONE)) {
|
||||||
|
a >>= _ONE
|
||||||
|
b >>= _ONE
|
||||||
|
shift++
|
||||||
|
}
|
||||||
|
while (!(a & _ONE)) a >>= _ONE
|
||||||
|
do {
|
||||||
|
while (!(b & _ONE)) b >>= _ONE
|
||||||
|
if (a > b) {
|
||||||
|
const x = a
|
||||||
|
a = b
|
||||||
|
b = x
|
||||||
|
}
|
||||||
|
b -= a
|
||||||
|
} while (b)
|
||||||
|
|
||||||
|
// rescale
|
||||||
|
return a << shift
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The least common multiple of a and b
|
||||||
|
*/
|
||||||
|
function lcm (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
if (a === _ZERO && b === _ZERO) { return _ZERO }
|
||||||
|
return abs(a * b) / gcd(a, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum. max(a,b)==a if a>=b. max(a,b)==b if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} maximum of numbers a and b
|
||||||
|
*/
|
||||||
|
function max (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
return (a >= b) ? a : b
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum. min(a,b)==b if a>=b. min(a,b)==a if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} minimum of numbers a and b
|
||||||
|
*/
|
||||||
|
function min (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
return (a >= b) ? b : a
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modular inverse.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a The number to find an inverse for
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} the inverse modulo n or NaN if it does not exist
|
||||||
|
*/
|
||||||
|
function modInv (a, n) {
|
||||||
|
const egcd = eGcd(toZn(a, n), n)
|
||||||
|
if (egcd.b !== _ONE) {
|
||||||
|
return NaN // modular inverse does not exist
|
||||||
|
} else {
|
||||||
|
return toZn(egcd.x, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modular exponentiation b**e mod n. Currently using the right-to-left binary method
|
||||||
|
*
|
||||||
|
* @param {number|bigint} b base
|
||||||
|
* @param {number|bigint} e exponent
|
||||||
|
* @param {number|bigint} n modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} b**e mod n
|
||||||
|
*/
|
||||||
|
function modPow (b, e, n) {
|
||||||
|
n = BigInt(n)
|
||||||
|
if (n === _ZERO) { return NaN } else if (n === _ONE) { return _ZERO }
|
||||||
|
|
||||||
|
b = toZn(b, n)
|
||||||
|
|
||||||
|
e = BigInt(e)
|
||||||
|
if (e < _ZERO) {
|
||||||
|
return modInv(modPow(b, abs(e), n), n)
|
||||||
|
}
|
||||||
|
|
||||||
|
let r = _ONE
|
||||||
|
while (e > 0) {
|
||||||
|
if ((e % _TWO) === _ONE) {
|
||||||
|
r = (r * b) % n
|
||||||
|
}
|
||||||
|
e = e / _TWO
|
||||||
|
b = b ** _TWO % n
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the smallest positive element that is congruent to a in modulo n
|
||||||
|
* @param {number|bigint} a An integer
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} The smallest positive representation of a in modulo n
|
||||||
|
*/
|
||||||
|
function toZn (a, n) {
|
||||||
|
n = BigInt(n)
|
||||||
|
if (n <= 0) { return NaN }
|
||||||
|
|
||||||
|
a = BigInt(a) % n
|
||||||
|
return (a < 0) ? a + n : a
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.abs = abs
|
||||||
|
exports.bitLength = bitLength
|
||||||
|
exports.eGcd = eGcd
|
||||||
|
exports.gcd = gcd
|
||||||
|
exports.lcm = lcm
|
||||||
|
exports.max = max
|
||||||
|
exports.min = min
|
||||||
|
exports.modInv = modInv
|
||||||
|
exports.modPow = modPow
|
||||||
|
exports.toZn = toZn
|
File diff suppressed because it is too large
Load Diff
52
package.json
52
package.json
|
@ -20,23 +20,51 @@
|
||||||
"url": "https://github.com/juanelas"
|
"url": "https://github.com/juanelas"
|
||||||
},
|
},
|
||||||
"repository": "github:juanelas/bigint-mod-arith",
|
"repository": "github:juanelas/bigint-mod-arith",
|
||||||
"main": "./dist/bigint-mod-arith-latest.node.js",
|
"main": "./lib/index.node.js",
|
||||||
"browser": "./dist/bigint-mod-arith-latest.browser.mod.js",
|
"browser": "./lib/index.browser.mod.js",
|
||||||
|
"types": "./types/index.d.ts",
|
||||||
"directories": {
|
"directories": {
|
||||||
"build": "./build",
|
"build": "./build",
|
||||||
"dist": "./dist",
|
"lib": "./lib",
|
||||||
"src": "./src"
|
"src": "./src",
|
||||||
|
"test": "./test",
|
||||||
|
"types": "./types"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node build/build.rollup.js",
|
"test": "mocha",
|
||||||
"build:docs": "jsdoc2md --template=README.hbs --files ./src/main.js > README.md",
|
"build:js": "rollup -c build/rollup.config.js",
|
||||||
"build:all": "npm run build && npm run build:docs",
|
"build:standard": "standard --fix",
|
||||||
"prepublishOnly": "npm run build && npm run build:docs"
|
"build:browserTests": "rollup -c build/rollup.tests.config.js",
|
||||||
|
"build:docs": "jsdoc2md --template=./src/doc/readme-template.md --files ./lib/index.browser.mod.js -d 3 -g none > README.md",
|
||||||
|
"build:dts": "node build/build.dts.js",
|
||||||
|
"build": "run-s build:**",
|
||||||
|
"prepublishOnly": "npm run build"
|
||||||
|
},
|
||||||
|
"standard": {
|
||||||
|
"env": [
|
||||||
|
"mocha"
|
||||||
|
],
|
||||||
|
"globals": [
|
||||||
|
"BigInt"
|
||||||
|
],
|
||||||
|
"ignore": [
|
||||||
|
"/test/browser/",
|
||||||
|
"/lib/index.browser.bundle.js",
|
||||||
|
"/lib/index.browser.bundle.mod.js"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"jsdoc-to-markdown": "^4.0.1",
|
"@rollup/plugin-commonjs": "^11.0.2",
|
||||||
"rollup": "^1.10.1",
|
"@rollup/plugin-multi-entry": "^3.0.0",
|
||||||
"rollup-plugin-babel-minify": "^8.0.0",
|
"@rollup/plugin-node-resolve": "^7.1.1",
|
||||||
"rollup-plugin-commonjs": "^9.3.4"
|
"@rollup/plugin-replace": "^2.3.1",
|
||||||
|
"chai": "^4.2.0",
|
||||||
|
"jsdoc-to-markdown": "^5.0.3",
|
||||||
|
"mocha": "^7.1.1",
|
||||||
|
"npm-run-all": "^4.1.5",
|
||||||
|
"rollup": "^2.3.3",
|
||||||
|
"rollup-plugin-terser": "^5.3.0",
|
||||||
|
"standard": "^14.3.3",
|
||||||
|
"typescript": "^3.8.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>{{PKG_NAME}} - Mocha Tests</title>
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/{{MOCHA_VERSION}}/mocha.min.css">
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/{{MOCHA_VERSION}}/mocha.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/{{CHAI_VERSION}}/chai.min.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="mocha"></div>
|
||||||
|
<script>mocha.setup('bdd'); mocha.setup({ timeout: 90000 });</script>
|
||||||
|
{{TESTS}}
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,79 @@
|
||||||
|
[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
|
||||||
|
|
||||||
|
# bigint-mod-arith
|
||||||
|
|
||||||
|
Some extra functions to work with modular arithmetic using native JS ([ES-2020](https://tc39.es/ecma262/#sec-bigint-objects)) implementation of BigInt. It can be used by any [Web Browser or webview supporting BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) and with Node.js (>=10.4.0).
|
||||||
|
|
||||||
|
> The operations supported on BigInts are not constant time. BigInt can be therefore **[unsuitable for use in cryptography](https://www.chosenplaintext.ca/articles/beginners-guide-constant-time-cryptography.html).** Many platforms provide native support for cryptography, such as [Web Cryptography API](https://w3c.github.io/webcrypto/) or [Node.js Crypto](https://nodejs.org/dist/latest/docs/api/crypto.html).
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
bigint-mod-arith is distributed for [web browsers and/or webviews supporting BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#Browser_compatibility) as an ES6 module or an IIFE file; and for Node.js (>=10.4.0), as a CJS module.
|
||||||
|
|
||||||
|
bigint-mod-arith can be imported to your project with `npm`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install bigint-mod-arith
|
||||||
|
```
|
||||||
|
NPM installation defaults to the ES6 module for browsers and the CJS one for Node.js.
|
||||||
|
|
||||||
|
For web browsers, you can also directly download the [IIFE bundle](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/lib/index.browser.bundle.js) or the [ES6 bundle module](https://raw.githubusercontent.com/juanelas/bigint-mod-arith/master/lib/index.browser.bundle.mod.js) from GitHub.
|
||||||
|
|
||||||
|
## Usage example
|
||||||
|
|
||||||
|
Import your module as :
|
||||||
|
|
||||||
|
- Node.js
|
||||||
|
```javascript
|
||||||
|
const bigintCryptoUtils = require('bigint-mod-arith')
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
- JavaScript native project
|
||||||
|
```javascript
|
||||||
|
import * as bigintCryptoUtils from 'bigint-mod-arith'
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
- Javascript native browser ES6 mod
|
||||||
|
```html
|
||||||
|
<script type="module">
|
||||||
|
import * as bigintCryptoUtils from 'lib/index.browser.bundle.mod.js' // Use you actual path to the broser mod bundle
|
||||||
|
... // your code here
|
||||||
|
</script>
|
||||||
|
import as bcu from 'bigint-mod-arith'
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
- JavaScript native browser IIFE
|
||||||
|
```html
|
||||||
|
<script src="../../lib/index.browser.bundle.js"></script>
|
||||||
|
<script>
|
||||||
|
... // your code here
|
||||||
|
</script>
|
||||||
|
- TypeScript
|
||||||
|
```typescript
|
||||||
|
import * as bigintCryptoUtils from 'bigint-mod-arith'
|
||||||
|
... // your code here
|
||||||
|
```
|
||||||
|
> BigInt is [ES-2020](https://tc39.es/ecma262/#sec-bigint-objects). In order to use it with TypeScript you should set `lib` (and probably also `target` and `module`) to `esnext` in `tsconfig.json`.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
/* Stage 3 BigInts with value 666 can be declared as BigInt('666')
|
||||||
|
or the shorter new no-so-linter-friendly syntax 666n.
|
||||||
|
Notice that you can also pass a number, e.g. BigInt(666), but it is not
|
||||||
|
recommended since values over 2**53 - 1 won't be safe but no warning will
|
||||||
|
be raised.
|
||||||
|
*/
|
||||||
|
const a = BigInt('5')
|
||||||
|
const b = BigInt('2')
|
||||||
|
const n = BigInt('19')
|
||||||
|
|
||||||
|
console.log(bigintCryptoUtils.modPow(a, b, n)) // prints 6
|
||||||
|
|
||||||
|
console.log(bigintCryptoUtils.modInv(BigInt('2'), BigInt('5'))) // prints 3
|
||||||
|
|
||||||
|
console.log(bigintCryptoUtils.modInv(BigInt('3'), BigInt('5'))) // prints 2
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## JS Doc
|
||||||
|
|
||||||
|
{{>main}}
|
|
@ -0,0 +1,214 @@
|
||||||
|
const _ZERO = BigInt(0)
|
||||||
|
const _ONE = BigInt(1)
|
||||||
|
const _TWO = BigInt(2)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
*
|
||||||
|
* @returns {bigint} the absolute value of a
|
||||||
|
*/
|
||||||
|
export function abs (a) {
|
||||||
|
a = BigInt(a)
|
||||||
|
return (a >= _ZERO) ? a : -a
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the bitlength of a number
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @returns {number} - the bit length
|
||||||
|
*/
|
||||||
|
export function bitLength (a) {
|
||||||
|
a = BigInt(a)
|
||||||
|
if (a === _ONE) { return 1 }
|
||||||
|
let bits = 1
|
||||||
|
do {
|
||||||
|
bits++
|
||||||
|
} while ((a >>= _ONE) > _ONE)
|
||||||
|
return bits
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
* @property {bigint} g
|
||||||
|
* @property {bigint} x
|
||||||
|
* @property {bigint} y
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
||||||
|
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {egcdReturn} A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*/
|
||||||
|
export function eGcd (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
if (a <= _ZERO | b <= _ZERO) { return NaN } // a and b MUST be positive
|
||||||
|
|
||||||
|
let x = _ZERO
|
||||||
|
let y = _ONE
|
||||||
|
let u = _ONE
|
||||||
|
let v = _ZERO
|
||||||
|
|
||||||
|
while (a !== _ZERO) {
|
||||||
|
const q = b / a
|
||||||
|
const r = b % a
|
||||||
|
const m = x - (u * q)
|
||||||
|
const n = y - (v * q)
|
||||||
|
b = a
|
||||||
|
a = r
|
||||||
|
x = u
|
||||||
|
y = v
|
||||||
|
u = m
|
||||||
|
v = n
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
b: b,
|
||||||
|
x: x,
|
||||||
|
y: y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The greatest common divisor of a and b
|
||||||
|
*/
|
||||||
|
export function gcd (a, b) {
|
||||||
|
a = abs(a)
|
||||||
|
b = abs(b)
|
||||||
|
if (a === _ZERO) { return b } else if (b === _ZERO) { return a }
|
||||||
|
|
||||||
|
let shift = _ZERO
|
||||||
|
while (!((a | b) & _ONE)) {
|
||||||
|
a >>= _ONE
|
||||||
|
b >>= _ONE
|
||||||
|
shift++
|
||||||
|
}
|
||||||
|
while (!(a & _ONE)) a >>= _ONE
|
||||||
|
do {
|
||||||
|
while (!(b & _ONE)) b >>= _ONE
|
||||||
|
if (a > b) {
|
||||||
|
const x = a
|
||||||
|
a = b
|
||||||
|
b = x
|
||||||
|
}
|
||||||
|
b -= a
|
||||||
|
} while (b)
|
||||||
|
|
||||||
|
// rescale
|
||||||
|
return a << shift
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The least common multiple of a and b
|
||||||
|
*/
|
||||||
|
export function lcm (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
if (a === _ZERO && b === _ZERO) { return _ZERO }
|
||||||
|
return abs(a * b) / gcd(a, b)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maximum. max(a,b)==a if a>=b. max(a,b)==b if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} maximum of numbers a and b
|
||||||
|
*/
|
||||||
|
export function max (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
return (a >= b) ? a : b
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum. min(a,b)==b if a>=b. min(a,b)==a if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} minimum of numbers a and b
|
||||||
|
*/
|
||||||
|
export function min (a, b) {
|
||||||
|
a = BigInt(a)
|
||||||
|
b = BigInt(b)
|
||||||
|
return (a >= b) ? b : a
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modular inverse.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a The number to find an inverse for
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} the inverse modulo n or NaN if it does not exist
|
||||||
|
*/
|
||||||
|
export function modInv (a, n) {
|
||||||
|
const egcd = eGcd(toZn(a, n), n)
|
||||||
|
if (egcd.b !== _ONE) {
|
||||||
|
return NaN // modular inverse does not exist
|
||||||
|
} else {
|
||||||
|
return toZn(egcd.x, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modular exponentiation b**e mod n. Currently using the right-to-left binary method
|
||||||
|
*
|
||||||
|
* @param {number|bigint} b base
|
||||||
|
* @param {number|bigint} e exponent
|
||||||
|
* @param {number|bigint} n modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} b**e mod n
|
||||||
|
*/
|
||||||
|
export function modPow (b, e, n) {
|
||||||
|
n = BigInt(n)
|
||||||
|
if (n === _ZERO) { return NaN } else if (n === _ONE) { return _ZERO }
|
||||||
|
|
||||||
|
b = toZn(b, n)
|
||||||
|
|
||||||
|
e = BigInt(e)
|
||||||
|
if (e < _ZERO) {
|
||||||
|
return modInv(modPow(b, abs(e), n), n)
|
||||||
|
}
|
||||||
|
|
||||||
|
let r = _ONE
|
||||||
|
while (e > 0) {
|
||||||
|
if ((e % _TWO) === _ONE) {
|
||||||
|
r = (r * b) % n
|
||||||
|
}
|
||||||
|
e = e / _TWO
|
||||||
|
b = b ** _TWO % n
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the smallest positive element that is congruent to a in modulo n
|
||||||
|
* @param {number|bigint} a An integer
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} The smallest positive representation of a in modulo n
|
||||||
|
*/
|
||||||
|
export function toZn (a, n) {
|
||||||
|
n = BigInt(n)
|
||||||
|
if (n <= 0) { return NaN }
|
||||||
|
|
||||||
|
a = BigInt(a) % n
|
||||||
|
return (a < 0) ? a + n : a
|
||||||
|
}
|
165
src/main.js
165
src/main.js
|
@ -1,165 +0,0 @@
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const _ZERO = BigInt(0);
|
|
||||||
const _ONE = BigInt(1);
|
|
||||||
const _TWO = BigInt(2);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
*
|
|
||||||
* @returns {bigint} the absolute value of a
|
|
||||||
*/
|
|
||||||
export function abs(a) {
|
|
||||||
a = BigInt(a);
|
|
||||||
return (a >= _ZERO) ? a : -a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
* @property {bigint} g
|
|
||||||
* @property {bigint} x
|
|
||||||
* @property {bigint} y
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
|
||||||
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {egcdReturn}
|
|
||||||
*/
|
|
||||||
export function eGcd(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
let x = _ZERO;
|
|
||||||
let y = _ONE;
|
|
||||||
let u = _ONE;
|
|
||||||
let v = _ZERO;
|
|
||||||
|
|
||||||
while (a !== _ZERO) {
|
|
||||||
let q = b / a;
|
|
||||||
let r = b % a;
|
|
||||||
let m = x - (u * q);
|
|
||||||
let n = y - (v * q);
|
|
||||||
b = a;
|
|
||||||
a = r;
|
|
||||||
x = u;
|
|
||||||
y = v;
|
|
||||||
u = m;
|
|
||||||
v = n;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
b: b,
|
|
||||||
x: x,
|
|
||||||
y: y
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The greatest common divisor of a and b
|
|
||||||
*/
|
|
||||||
export function gcd(a, b) {
|
|
||||||
a = abs(a);
|
|
||||||
b = abs(b);
|
|
||||||
let shift = _ZERO;
|
|
||||||
while (!((a | b) & _ONE)) {
|
|
||||||
a >>= _ONE;
|
|
||||||
b >>= _ONE;
|
|
||||||
shift++;
|
|
||||||
}
|
|
||||||
while (!(a & _ONE)) a >>= _ONE;
|
|
||||||
do {
|
|
||||||
while (!(b & _ONE)) b >>= _ONE;
|
|
||||||
if (a > b) {
|
|
||||||
let x = a;
|
|
||||||
a = b;
|
|
||||||
b = x;
|
|
||||||
}
|
|
||||||
b -= a;
|
|
||||||
} while (b);
|
|
||||||
|
|
||||||
// rescale
|
|
||||||
return a << shift;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
|
||||||
* @param {number|bigint} a
|
|
||||||
* @param {number|bigint} b
|
|
||||||
*
|
|
||||||
* @returns {bigint} The least common multiple of a and b
|
|
||||||
*/
|
|
||||||
export function lcm(a, b) {
|
|
||||||
a = BigInt(a);
|
|
||||||
b = BigInt(b);
|
|
||||||
return abs(a * b) / gcd(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular inverse.
|
|
||||||
*
|
|
||||||
* @param {number|bigint} a The number to find an inverse for
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} the inverse modulo n
|
|
||||||
*/
|
|
||||||
export function modInv(a, n) {
|
|
||||||
let egcd = eGcd(a, n);
|
|
||||||
if (egcd.b !== _ONE) {
|
|
||||||
return null; // modular inverse does not exist
|
|
||||||
} else {
|
|
||||||
return toZn(egcd.x, n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Modular exponentiation a**b mod n
|
|
||||||
* @param {number|bigint} a base
|
|
||||||
* @param {number|bigint} b exponent
|
|
||||||
* @param {number|bigint} n modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} a**b mod n
|
|
||||||
*/
|
|
||||||
export function modPow(a, b, n) {
|
|
||||||
// See Knuth, volume 2, section 4.6.3.
|
|
||||||
n = BigInt(n);
|
|
||||||
a = toZn(a, n);
|
|
||||||
b = BigInt(b);
|
|
||||||
if (b < _ZERO) {
|
|
||||||
return modInv(modPow(a, abs(b), n), n);
|
|
||||||
}
|
|
||||||
let result = _ONE;
|
|
||||||
let x = a;
|
|
||||||
while (b > 0) {
|
|
||||||
var leastSignificantBit = b % _TWO;
|
|
||||||
b = b / _TWO;
|
|
||||||
if (leastSignificantBit == _ONE) {
|
|
||||||
result = result * x;
|
|
||||||
result = result % n;
|
|
||||||
}
|
|
||||||
x = x * x;
|
|
||||||
x = x % n;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Finds the smallest positive element that is congruent to a in modulo n
|
|
||||||
* @param {number|bigint} a An integer
|
|
||||||
* @param {number|bigint} n The modulo
|
|
||||||
*
|
|
||||||
* @returns {bigint} The smallest positive representation of a in modulo n
|
|
||||||
*/
|
|
||||||
export function toZn(a, n) {
|
|
||||||
n = BigInt(n);
|
|
||||||
a = BigInt(a) % n;
|
|
||||||
return (a < 0) ? a + n : a;
|
|
||||||
}
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
value: BigInt(1),
|
||||||
|
abs: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt(-2),
|
||||||
|
abs: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'),
|
||||||
|
abs: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'),
|
||||||
|
abs: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('abs', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`abs(${input.value})`, function () {
|
||||||
|
it(`should return ${input.abs}`, function () {
|
||||||
|
const ret = _pkg.abs(input.value)
|
||||||
|
chai.expect(ret).to.equal(input.abs)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,34 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
value: BigInt(1),
|
||||||
|
bitLength: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt(-2),
|
||||||
|
bitLength: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt(11592217955149597331),
|
||||||
|
abs: BigInt(11592217955149597331),
|
||||||
|
bitLength: 64
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('bitLength', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`bitLength(${input.value})`, function () {
|
||||||
|
it(`should return ${input.bitLength}`, function () {
|
||||||
|
const ret = _pkg.bitLength(input.value)
|
||||||
|
chai.expect(ret).to.equal(input.bitLength)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,23 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title>bigint-mod-arith - Mocha Tests</title>
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/mocha/7.1.1/mocha.min.css">
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/7.1.1/mocha.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/4.2.0/chai.min.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="mocha"></div>
|
||||||
|
<script>mocha.setup('bdd'); mocha.setup({ timeout: 90000 });</script>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import * as _pkg from '../../../lib/index.browser.bundle.mod.js'
|
||||||
|
window._pkg = _pkg;
|
||||||
|
import './tests.js';
|
||||||
|
mocha.run();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,490 @@
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
value: BigInt(1),
|
||||||
|
abs: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt(-2),
|
||||||
|
abs: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'),
|
||||||
|
abs: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'),
|
||||||
|
abs: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('abs', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`abs(${input.value})`, function () {
|
||||||
|
it(`should return ${input.abs}`, function () {
|
||||||
|
const ret = _pkg.abs(input.value);
|
||||||
|
chai.expect(ret).to.equal(input.abs);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$1 = [
|
||||||
|
{
|
||||||
|
value: BigInt(1),
|
||||||
|
bitLength: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt(-2),
|
||||||
|
bitLength: 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: BigInt(11592217955149597331),
|
||||||
|
abs: BigInt(11592217955149597331),
|
||||||
|
bitLength: 64
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('bitLength', function () {
|
||||||
|
for (const input of inputs$1) {
|
||||||
|
describe(`bitLength(${input.value})`, function () {
|
||||||
|
it(`should return ${input.bitLength}`, function () {
|
||||||
|
const ret = _pkg.bitLength(input.value);
|
||||||
|
chai.expect(ret).to.equal(input.bitLength);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$2 = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt(1),
|
||||||
|
gcd: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(0),
|
||||||
|
b: BigInt(189),
|
||||||
|
gcd: BigInt(189)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(189),
|
||||||
|
b: BigInt(0),
|
||||||
|
gcd: BigInt(189)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(0),
|
||||||
|
b: BigInt(0),
|
||||||
|
gcd: BigInt(0)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt('14546149867129487614601346814'),
|
||||||
|
gcd: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(27),
|
||||||
|
b: BigInt(18),
|
||||||
|
gcd: BigInt(9)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-27),
|
||||||
|
b: BigInt(18),
|
||||||
|
gcd: BigInt(9)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109'),
|
||||||
|
b: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109') * BigInt('144678545212641449725111562354371812236197961234111744040227045242578772124779004756249085154188369039159690638725821245974978963371615699005072473649705367893567309027634121825164880046600125480885803891136149601797439273507802533807541605261215613891134865916295914192271736572001975016089773532547481638243'),
|
||||||
|
gcd: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('gcd', function () {
|
||||||
|
for (const input of inputs$2) {
|
||||||
|
describe(`gcd(${input.a}, ${input.b})`, function () {
|
||||||
|
it(`should return ${input.gcd}`, function () {
|
||||||
|
const ret = _pkg.gcd(input.a, input.b);
|
||||||
|
chai.expect(ret).to.equal(input.gcd);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$3 = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt(1),
|
||||||
|
lcm: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt('14546149867129487614601346814'),
|
||||||
|
lcm: BigInt('14546149867129487614601346814')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(27),
|
||||||
|
b: BigInt(18),
|
||||||
|
lcm: BigInt(27) * BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-27),
|
||||||
|
b: BigInt(18),
|
||||||
|
lcm: BigInt(27) * BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109'),
|
||||||
|
b: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109') * BigInt('144678545212641449725111562354371812236197961234111744040227045242578772124779004756249085154188369039159690638725821245974978963371615699005072473649705367893567309027634121825164880046600125480885803891136149601797439273507802533807541605261215613891134865916295914192271736572001975016089773532547481638243'),
|
||||||
|
lcm: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109') * BigInt('144678545212641449725111562354371812236197961234111744040227045242578772124779004756249085154188369039159690638725821245974978963371615699005072473649705367893567309027634121825164880046600125480885803891136149601797439273507802533807541605261215613891134865916295914192271736572001975016089773532547481638243')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('lcm', function () {
|
||||||
|
for (const input of inputs$3) {
|
||||||
|
describe(`lcm(${input.a}, ${input.b})`, function () {
|
||||||
|
it(`should return ${input.lcm}`, function () {
|
||||||
|
const ret = _pkg.lcm(input.a, input.b);
|
||||||
|
chai.expect(ret).to.equal(input.lcm);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$4 = [
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(2)],
|
||||||
|
max: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(1)],
|
||||||
|
max: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(2)],
|
||||||
|
max: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(-2)],
|
||||||
|
max: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(1)],
|
||||||
|
max: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(-2)],
|
||||||
|
max: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
max: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('max', function () {
|
||||||
|
for (const input of inputs$4) {
|
||||||
|
describe(`max(${input.value[0]}, ${input.value[1]})`, function () {
|
||||||
|
it(`should return ${input.max}`, function () {
|
||||||
|
const ret = _pkg.max(input.value[0], input.value[1]);
|
||||||
|
chai.expect(ret).to.equal(input.max);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$5 = [
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(2)],
|
||||||
|
min: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(1)],
|
||||||
|
min: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(2)],
|
||||||
|
min: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(-2)],
|
||||||
|
min: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(1)],
|
||||||
|
min: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(-2)],
|
||||||
|
min: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
min: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('min', function () {
|
||||||
|
for (const input of inputs$5) {
|
||||||
|
describe(`min(${input.value[0]}, ${input.value[1]})`, function () {
|
||||||
|
it(`should return ${input.min}`, function () {
|
||||||
|
const ret = _pkg.min(input.value[0], input.value[1]);
|
||||||
|
chai.expect(ret).to.equal(input.min);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$6 = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
n: BigInt(19),
|
||||||
|
modInv: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(2),
|
||||||
|
n: BigInt(5),
|
||||||
|
modInv: BigInt(3)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-2),
|
||||||
|
n: BigInt(5),
|
||||||
|
modInv: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(2),
|
||||||
|
n: BigInt(4),
|
||||||
|
modInv: NaN
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('modInv', function () {
|
||||||
|
for (const input of inputs$6) {
|
||||||
|
describe(`modInv(${input.a}, ${input.n})`, function () {
|
||||||
|
it(`should return ${input.modInv}`, function () {
|
||||||
|
const ret = _pkg.modInv(input.a, input.n);
|
||||||
|
// chai.assert( String(ret) === String(input.modInv) );
|
||||||
|
chai.expect(String(ret)).to.be.equal(String(input.modInv));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$7 = [
|
||||||
|
{
|
||||||
|
a: BigInt(4),
|
||||||
|
b: BigInt(-1),
|
||||||
|
n: BigInt(19),
|
||||||
|
modPow: BigInt(5)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-5),
|
||||||
|
b: BigInt(2),
|
||||||
|
n: BigInt(7),
|
||||||
|
modPow: BigInt(4)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(2),
|
||||||
|
b: BigInt(255),
|
||||||
|
n: BigInt(64),
|
||||||
|
modPow: BigInt(0)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(3),
|
||||||
|
b: BigInt(3),
|
||||||
|
n: BigInt(25),
|
||||||
|
modPow: BigInt(2)
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('modPow', function () {
|
||||||
|
this.timeout(90000);
|
||||||
|
for (const input of inputs$7) {
|
||||||
|
describe(`modPow(${input.a}, ${input.b}, ${input.n})`, function () {
|
||||||
|
it(`should return ${input.modPow}`, function () {
|
||||||
|
const ret = _pkg.modPow(input.a, input.b, input.n);
|
||||||
|
chai.expect(ret).to.equal(input.modPow);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
describe('Time profiling', function () {
|
||||||
|
let iterations = 500;
|
||||||
|
it(`just testing ${iterations} iterations of a big modular exponentiation (1024 bits)`, function () {
|
||||||
|
const p = BigInt('103920301461718841589267304263845359224454055603847417021399996422142529929535423886894599506329362009085557636432288745748144369296043048325513558512136442971686130986388589421125262751724362880217790112013162815676017250234401214198365302142787009943498370856167174244675719638815809347261773472114842038647');
|
||||||
|
const b = BigInt('313632271690673451924314047671460131678794095260951233878123501752357966284491455239133687519908410656818506813151659324961829045286402303082891913186909806785080978448037486178337722667190743610785429936585699831407575170854873682955317589189564880931807976657385223632835801016017549762825562427694700595');
|
||||||
|
const e = BigInt('452149997592306202232720864363485824701879487303880767747217308770351197801836846325633986474037061753983278534192061455638289551714281047915315943771002615269860312318606105460307037327329178890486613832051027105330475852552183444938408408863970975090778239473049899109989825645608770309107015209564444316');
|
||||||
|
while (iterations > 0) {
|
||||||
|
_pkg.modPow(b, e, p);
|
||||||
|
iterations--;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
|
||||||
|
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs$8 = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
n: BigInt(19),
|
||||||
|
toZn: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-25),
|
||||||
|
n: BigInt(9),
|
||||||
|
toZn: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt('12359782465012847510249'),
|
||||||
|
n: BigInt(5),
|
||||||
|
toZn: BigInt(4)
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
describe('toZn', function () {
|
||||||
|
for (const input of inputs$8) {
|
||||||
|
describe(`toZn(${input.a}, ${input.n})`, function () {
|
||||||
|
it(`should return ${input.toZn}`, function () {
|
||||||
|
const ret = _pkg.toZn(input.a, input.n);
|
||||||
|
chai.expect(ret).to.equal(input.toZn);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,61 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt(1),
|
||||||
|
gcd: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(0),
|
||||||
|
b: BigInt(189),
|
||||||
|
gcd: BigInt(189)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(189),
|
||||||
|
b: BigInt(0),
|
||||||
|
gcd: BigInt(189)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(0),
|
||||||
|
b: BigInt(0),
|
||||||
|
gcd: BigInt(0)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt('14546149867129487614601346814'),
|
||||||
|
gcd: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(27),
|
||||||
|
b: BigInt(18),
|
||||||
|
gcd: BigInt(9)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-27),
|
||||||
|
b: BigInt(18),
|
||||||
|
gcd: BigInt(9)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109'),
|
||||||
|
b: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109') * BigInt('144678545212641449725111562354371812236197961234111744040227045242578772124779004756249085154188369039159690638725821245974978963371615699005072473649705367893567309027634121825164880046600125480885803891136149601797439273507802533807541605261215613891134865916295914192271736572001975016089773532547481638243'),
|
||||||
|
gcd: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('gcd', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`gcd(${input.a}, ${input.b})`, function () {
|
||||||
|
it(`should return ${input.gcd}`, function () {
|
||||||
|
const ret = _pkg.gcd(input.a, input.b)
|
||||||
|
chai.expect(ret).to.equal(input.gcd)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,46 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt(1),
|
||||||
|
lcm: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
b: BigInt('14546149867129487614601346814'),
|
||||||
|
lcm: BigInt('14546149867129487614601346814')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(27),
|
||||||
|
b: BigInt(18),
|
||||||
|
lcm: BigInt(27) * BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-27),
|
||||||
|
b: BigInt(18),
|
||||||
|
lcm: BigInt(27) * BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109'),
|
||||||
|
b: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109') * BigInt('144678545212641449725111562354371812236197961234111744040227045242578772124779004756249085154188369039159690638725821245974978963371615699005072473649705367893567309027634121825164880046600125480885803891136149601797439273507802533807541605261215613891134865916295914192271736572001975016089773532547481638243'),
|
||||||
|
lcm: BigInt('168694196579467171180863939518634764192343817610869919231900537093664715354591592262546800497540343203057121816378265655992490621138321114570420047522219942818258345349322155251835677199539229050711145144861404607171419723967136221126986330819362088262358855325306938646602003059377699727688477555163239222109') * BigInt('144678545212641449725111562354371812236197961234111744040227045242578772124779004756249085154188369039159690638725821245974978963371615699005072473649705367893567309027634121825164880046600125480885803891136149601797439273507802533807541605261215613891134865916295914192271736572001975016089773532547481638243')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('lcm', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`lcm(${input.a}, ${input.b})`, function () {
|
||||||
|
it(`should return ${input.lcm}`, function () {
|
||||||
|
const ret = _pkg.lcm(input.a, input.b)
|
||||||
|
chai.expect(ret).to.equal(input.lcm)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,93 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(2)],
|
||||||
|
max: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(1)],
|
||||||
|
max: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(2)],
|
||||||
|
max: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(-2)],
|
||||||
|
max: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(1)],
|
||||||
|
max: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(-2)],
|
||||||
|
max: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
max: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
max: BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
max: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('max', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`max(${input.value[0]}, ${input.value[1]})`, function () {
|
||||||
|
it(`should return ${input.max}`, function () {
|
||||||
|
const ret = _pkg.max(input.value[0], input.value[1])
|
||||||
|
chai.expect(ret).to.equal(input.max)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,93 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(2)],
|
||||||
|
min: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(1)],
|
||||||
|
min: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(2), BigInt(2)],
|
||||||
|
min: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(1), BigInt(-2)],
|
||||||
|
min: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(1)],
|
||||||
|
min: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt(-2), BigInt(-2)],
|
||||||
|
min: BigInt(-2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
min: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252'), BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777'), BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')],
|
||||||
|
min: BigInt('-115922179551495973383410176342643722334557255682879605864838806293659619625004303206250384392546855063844106965156287951749387634112551089284595541103692716528774876311641700929986988023197242224581099872580798960693521778607396791006450968430359009613295725905514216842343121690916290236558767890728449777')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('94120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('918145974144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: [BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203'), BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')],
|
||||||
|
min: BigInt('-918145944120889203205646923554374144932845997937845799234617798611046542304088105084854788397071323714642587188481158334265864050544813693415594035822877094557870151480865568334936301231664228940480803192289508235412296324312748621874408067955753620604885023289655277704554716080844406284392300643321715285709865081125252390440327650852470312931679380011885102491340191287595160450544053114365852338670819405357496612993587404998677760882578064637552397840566752638770525765833183986360029736508910848408875329873614164495552615086579144675027852136994842529623698055210822311666048300438808691619782893307972452223713060928388502843564836966586109748062827799521852219158489504529458627699284110902303538160168376473182639384638674469114371472053977558648090155686345760457454061117853710619580819749222459422610617170567016772342291486643520567969321969827786373531753524990712622940069883277763528926899970596407140603912036918433859986491820017690762751824769335720368488097262208835708414085501930989486498185503469986946236128468697606998536541209764920494156326791142098506801288127033229779646920082892258428128572765585196779698362187479280520327053508580551167899837393726371144977951402741307021389967382422805567365901203')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('min', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`min(${input.value[0]}, ${input.value[1]})`, function () {
|
||||||
|
it(`should return ${input.min}`, function () {
|
||||||
|
const ret = _pkg.min(input.value[0], input.value[1])
|
||||||
|
chai.expect(ret).to.equal(input.min)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,42 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
n: BigInt(19),
|
||||||
|
modInv: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(2),
|
||||||
|
n: BigInt(5),
|
||||||
|
modInv: BigInt(3)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-2),
|
||||||
|
n: BigInt(5),
|
||||||
|
modInv: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(2),
|
||||||
|
n: BigInt(4),
|
||||||
|
modInv: NaN
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('modInv', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`modInv(${input.a}, ${input.n})`, function () {
|
||||||
|
it(`should return ${input.modInv}`, function () {
|
||||||
|
const ret = _pkg.modInv(input.a, input.n)
|
||||||
|
// chai.assert( String(ret) === String(input.modInv) );
|
||||||
|
chai.expect(String(ret)).to.be.equal(String(input.modInv))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,58 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
a: BigInt(4),
|
||||||
|
b: BigInt(-1),
|
||||||
|
n: BigInt(19),
|
||||||
|
modPow: BigInt(5)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-5),
|
||||||
|
b: BigInt(2),
|
||||||
|
n: BigInt(7),
|
||||||
|
modPow: BigInt(4)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(2),
|
||||||
|
b: BigInt(255),
|
||||||
|
n: BigInt(64),
|
||||||
|
modPow: BigInt(0)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(3),
|
||||||
|
b: BigInt(3),
|
||||||
|
n: BigInt(25),
|
||||||
|
modPow: BigInt(2)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('modPow', function () {
|
||||||
|
this.timeout(90000)
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`modPow(${input.a}, ${input.b}, ${input.n})`, function () {
|
||||||
|
it(`should return ${input.modPow}`, function () {
|
||||||
|
const ret = _pkg.modPow(input.a, input.b, input.n)
|
||||||
|
chai.expect(ret).to.equal(input.modPow)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
describe('Time profiling', function () {
|
||||||
|
let iterations = 500
|
||||||
|
it(`just testing ${iterations} iterations of a big modular exponentiation (1024 bits)`, function () {
|
||||||
|
const p = BigInt('103920301461718841589267304263845359224454055603847417021399996422142529929535423886894599506329362009085557636432288745748144369296043048325513558512136442971686130986388589421125262751724362880217790112013162815676017250234401214198365302142787009943498370856167174244675719638815809347261773472114842038647')
|
||||||
|
const b = BigInt('313632271690673451924314047671460131678794095260951233878123501752357966284491455239133687519908410656818506813151659324961829045286402303082891913186909806785080978448037486178337722667190743610785429936585699831407575170854873682955317589189564880931807976657385223632835801016017549762825562427694700595')
|
||||||
|
const e = BigInt('452149997592306202232720864363485824701879487303880767747217308770351197801836846325633986474037061753983278534192061455638289551714281047915315943771002615269860312318606105460307037327329178890486613832051027105330475852552183444938408408863970975090778239473049899109989825645608770309107015209564444316')
|
||||||
|
while (iterations > 0) {
|
||||||
|
_pkg.modPow(b, e, p)
|
||||||
|
iterations--
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
|
@ -0,0 +1,36 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
|
// Every test file (you can create as many as you want) should start like this
|
||||||
|
// Please, do NOT touch. They will be automatically removed for browser tests -->
|
||||||
|
const _pkg = require('../lib/index.node')
|
||||||
|
const chai = require('chai')
|
||||||
|
// <--
|
||||||
|
|
||||||
|
const inputs = [
|
||||||
|
{
|
||||||
|
a: BigInt(1),
|
||||||
|
n: BigInt(19),
|
||||||
|
toZn: BigInt(1)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt(-25),
|
||||||
|
n: BigInt(9),
|
||||||
|
toZn: BigInt(2)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
a: BigInt('12359782465012847510249'),
|
||||||
|
n: BigInt(5),
|
||||||
|
toZn: BigInt(4)
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
describe('toZn', function () {
|
||||||
|
for (const input of inputs) {
|
||||||
|
describe(`toZn(${input.a}, ${input.n})`, function () {
|
||||||
|
it(`should return ${input.toZn}`, function () {
|
||||||
|
const ret = _pkg.toZn(input.a, input.n)
|
||||||
|
chai.expect(ret).to.equal(input.toZn)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
|
@ -0,0 +1,101 @@
|
||||||
|
/**
|
||||||
|
* A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*/
|
||||||
|
export type egcdReturn = {
|
||||||
|
g: bigint;
|
||||||
|
x: bigint;
|
||||||
|
y: bigint;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* Absolute value. abs(a)==a if a>=0. abs(a)==-a if a<0
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
*
|
||||||
|
* @returns {bigint} the absolute value of a
|
||||||
|
*/
|
||||||
|
export function abs(a: number | bigint): bigint;
|
||||||
|
/**
|
||||||
|
* Returns the bitlength of a number
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @returns {number} - the bit length
|
||||||
|
*/
|
||||||
|
export function bitLength(a: number | bigint): number;
|
||||||
|
/**
|
||||||
|
* @typedef {Object} egcdReturn A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
* @property {bigint} g
|
||||||
|
* @property {bigint} x
|
||||||
|
* @property {bigint} y
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* An iterative implementation of the extended euclidean algorithm or extended greatest common divisor algorithm.
|
||||||
|
* Take positive integers a, b as input, and return a triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {egcdReturn} A triple (g, x, y), such that ax + by = g = gcd(a, b).
|
||||||
|
*/
|
||||||
|
export function eGcd(a: number | bigint, b: number | bigint): egcdReturn;
|
||||||
|
/**
|
||||||
|
* Greatest-common divisor of two integers based on the iterative binary algorithm.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The greatest common divisor of a and b
|
||||||
|
*/
|
||||||
|
export function gcd(a: number | bigint, b: number | bigint): bigint;
|
||||||
|
/**
|
||||||
|
* The least common multiple computed as abs(a*b)/gcd(a,b)
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} The least common multiple of a and b
|
||||||
|
*/
|
||||||
|
export function lcm(a: number | bigint, b: number | bigint): bigint;
|
||||||
|
/**
|
||||||
|
* Maximum. max(a,b)==a if a>=b. max(a,b)==b if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} maximum of numbers a and b
|
||||||
|
*/
|
||||||
|
export function max(a: number | bigint, b: number | bigint): bigint;
|
||||||
|
/**
|
||||||
|
* Minimum. min(a,b)==b if a>=b. min(a,b)==a if a<=b
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a
|
||||||
|
* @param {number|bigint} b
|
||||||
|
*
|
||||||
|
* @returns {bigint} minimum of numbers a and b
|
||||||
|
*/
|
||||||
|
export function min(a: number | bigint, b: number | bigint): bigint;
|
||||||
|
/**
|
||||||
|
* Modular inverse.
|
||||||
|
*
|
||||||
|
* @param {number|bigint} a The number to find an inverse for
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} the inverse modulo n or NaN if it does not exist
|
||||||
|
*/
|
||||||
|
export function modInv(a: number | bigint, n: number | bigint): bigint;
|
||||||
|
/**
|
||||||
|
* Modular exponentiation b**e mod n. Currently using the right-to-left binary method
|
||||||
|
*
|
||||||
|
* @param {number|bigint} b base
|
||||||
|
* @param {number|bigint} e exponent
|
||||||
|
* @param {number|bigint} n modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} b**e mod n
|
||||||
|
*/
|
||||||
|
export function modPow(b: number | bigint, e: number | bigint, n: number | bigint): bigint;
|
||||||
|
/**
|
||||||
|
* Finds the smallest positive element that is congruent to a in modulo n
|
||||||
|
* @param {number|bigint} a An integer
|
||||||
|
* @param {number|bigint} n The modulo
|
||||||
|
*
|
||||||
|
* @returns {bigint} The smallest positive representation of a in modulo n
|
||||||
|
*/
|
||||||
|
export function toZn(a: number | bigint, n: number | bigint): bigint;
|
Loading…
Reference in New Issue