{"_id":"@bradthomasbrown/finite-field","_rev":"10-fcae358013f81aca916a19439c15f981","name":"@bradthomasbrown/finite-field","dist-tags":{"latest":"2.0.6"},"versions":{"1.0.0":{"name":"@bradthomasbrown/finite-field","version":"1.0.0","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@1.0.0","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"73e03b0302e0e28c183510ae56e13eef4cdf58be","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-1.0.0.tgz","fileCount":4,"integrity":"sha512-BBrfrukNfgN6w2VA6JEDPvjf83MpUwBMghC+IgOwz976wIWJh/9fSae+zDWSPbh9KaWtq8h4v4X9hbZDlXwlmQ==","signatures":[{"sig":"MEUCID+cUZXKU8azteTGbMctJP6yCU84SHverkWvYhycaFMmAiEAxpS7EdvsN2myLrteLh0w0jZYwMoDZaP6sTxZViZwMOE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8137},"main":"./dist/finite-field.js","type":"module","types":"./dist/finite-field.d.ts","gitHead":"60cc645546ffa14ac5a70cf7eac3bf3690d17648","_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_1.0.0_1765077659996_0.005146207575743134","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bradthomasbrown/finite-field","version":"1.0.1","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@1.0.1","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"b570015894f1bb10d979d24cdfcd14918fbc82e0","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-1.0.1.tgz","fileCount":5,"integrity":"sha512-R45+6G6TE4ur4rdNuBwKz7k1uFSZ0EqmPwi1XZ8iCGjJjUh5DI7a5kMFZRnYX2Ox/5ZUKfyvVjSSnYFTR4TwrQ==","signatures":[{"sig":"MEYCIQDbWksgI+b6q0SXUJxYEyIJn9BwTdcYaS29NGNIp/OugAIhAJGWECvUek2kY/5oBeJOys5Ly4pb4UGy4ZANRq85/OPy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11841},"type":"module","exports":{".":"./dist/finite-field.js"},"gitHead":"7682f5e34dae6a19348baf5321e8e9cebe621928","_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_1.0.1_1765078521200_0.8588093717265171","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bradthomasbrown/finite-field","version":"1.1.0","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@1.1.0","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"1fe0bb9a17e6b2f91600e93d3e4210cdf7021bc0","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-1.1.0.tgz","fileCount":5,"integrity":"sha512-UDkf6BrXUWenv/aCN0vKZe4T4FdqyHu6TEaz1GwyJ3BoLTrnMfK0yE2AppbEMn1IfK6fKxJEMfIjqIG9Yc0W/w==","signatures":[{"sig":"MEUCIQDdxJ7mL+zyUug4gd1tIwGkpDEM6Dq8HSZS/VpXkd5RFgIgH6BezLuGRr8E88gJVlTpqqF+UwacXJO4fWhloXF7y1c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20393},"type":"module","exports":{".":"./dist/finite-field.js"},"gitHead":"a5f8c71adcaebc58cd6ce679c224e955c9febe84","_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/finite-field_1.1.0_1765585701271_0.9605535898477278","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bradthomasbrown/finite-field","version":"2.0.0","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@2.0.0","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"c39fec1bf6275093f72f3e829f666320a8740241","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-2.0.0.tgz","fileCount":5,"integrity":"sha512-TgJOTfNBp1KD2Mmm/tYj44wS8gV38L2M6hFtbHqw7+sWEGSvNFaXDUU8jLoyOX4gpSXmyo6XKlwEV5s5oI63zA==","signatures":[{"sig":"MEUCICiSaPrk8XkX1heHucDL/aK9SnSkBEjmmrH/ECok5HNhAiEAg+zdpa16SSMqgC8TdIq9FrjRpKGELVn8MOkQDdSlqM0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20582},"type":"module","exports":{".":"./dist/finite-field.js"},"gitHead":"256d51682e977c6ec6ef765bf543c5ea94ae9660","scripts":{"test":"bun test.ts","prepublishOnly":"npm test"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"ff1":"npm:@bradthomasbrown/finite-field@^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_2.0.0_1766202026987_0.8538695356938706","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bradthomasbrown/finite-field","version":"2.0.1","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@2.0.1","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"4bf262bf9ab94431f07f65582be5fb4a747341da","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-2.0.1.tgz","fileCount":8,"integrity":"sha512-K7yMrUFgw5F1CPo8aMeQQYt7TaE7E2OIclDdb47N3HOpJDIpR3hKTCTcgem2aClFcTBMEkHalGSM5ncQaLhPtQ==","signatures":[{"sig":"MEYCIQDh9DPMykJKP8YNxsoVgmQhE4oTyfNElwWGDBrw1A3FtgIhAJUOXevLnAfUNS0HaFtrzm5sjHJ/Qzm5QAozyku7yM/c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26116},"type":"module","exports":{".":"./dist/finite-field.js","./p3mod4":"./dist/p3mod4/finite-field.js"},"gitHead":"544748fecff7a2652df7d67c8fa2bcd8daf46eb5","scripts":{"bump-patch":"npm version patch && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"ff1":"npm:@bradthomasbrown/finite-field@^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_2.0.1_1766202857609_0.6237777574951697","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@bradthomasbrown/finite-field","version":"2.0.2","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@2.0.2","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"8fe6c12f0a4959050237913683f5e4ad7be35807","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-2.0.2.tgz","fileCount":8,"integrity":"sha512-x+7ifwe68yxPn32iBKQCGjdIRYWQtmH4Nc5tnxOe+zVt+xWUCxUrXE0tqX7CZPBQTKU+Cu6bLEk0iTCnLFLzpA==","signatures":[{"sig":"MEYCIQDlY4rt2rvwgzctRQJOa4kh4rPnSsbRxsAwjpGjV4ZRtwIhANBF58M7oOtAuEFT9dAtMyPv0sxuy/Vm1EydLloysoo2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26275},"type":"module","exports":{".":"./dist/finite-field.js","./p3mod4":"./dist/p3mod4/finite-field.js"},"gitHead":"63c71ff79074e2b55313baa964fcfc843a0da2df","scripts":{"bump-patch":"npm version patch && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"ff1":"npm:@bradthomasbrown/finite-field@^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_2.0.2_1766207405700_0.48593449355975604","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@bradthomasbrown/finite-field","version":"2.0.3","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@2.0.3","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"6ec556f024b99086e8f42dc07e20f9059df1c088","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-2.0.3.tgz","fileCount":8,"integrity":"sha512-AeWBBMxPOvMKY8bSOsaVmpoN26aB1paJUiT61uHIeZIlvLTz/PxI0Q5B6vW5AMv9+LOoz7VvSnX9bG2jyILptA==","signatures":[{"sig":"MEYCIQDesnXaGwDTq+EacuUhy85cf6HZfEty7qwcGVcAHnXoMAIhAPVw/27cqu6520sCPgEK22QOJVMifX3FWixaXazX47dQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26292},"type":"module","exports":{".":"./dist/finite-field.js","./p3mod4":"./dist/p3mod4/finite-field.js"},"gitHead":"a780df74456a37910b4a30e5426f763bd9819eaa","scripts":{"bump-patch":"npm version patch && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"ff1":"npm:@bradthomasbrown/finite-field@^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_2.0.3_1766207788640_0.6272804026644347","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@bradthomasbrown/finite-field","version":"2.0.4","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@2.0.4","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"62daf2bf3aa2a4d899ef25507901356fd6c65b74","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-2.0.4.tgz","fileCount":8,"integrity":"sha512-LcYlKJN6qk+5BXStiam077ndpVB3gODPhtpJxKd1Md2l/IWt1CYa/2nbk6TfUSNgTdb+qJcIEcMXCXXiGH1XHg==","signatures":[{"sig":"MEUCIQCfjNpyBz46W0le3dE8JyIPr3AkF7/L9+RQI81epKLcHQIgUQXm6Q+nrglSUQ2uv/gmDZH6dr4HZucIUcheFbmwzHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26042},"type":"module","exports":{".":"./dist/finite-field.js","./p3mod4":"./dist/p3mod4/finite-field.js"},"gitHead":"4fa6aba87eefa4829f0d90343f0552415493698d","scripts":{"bump-patch":"npm version patch && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"ff1":"npm:@bradthomasbrown/finite-field@^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_2.0.4_1766210338149_0.21995132919897298","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@bradthomasbrown/finite-field","version":"2.0.5","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"_id":"@bradthomasbrown/finite-field@2.0.5","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"dist":{"shasum":"406faf447d79a94b7ea993fdc449a9f0399644ef","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-2.0.5.tgz","fileCount":8,"integrity":"sha512-poncxbfqYkK4vHnTbxUNqOjTwPLda2eNCkZirwuonhcPCqO7dCPsgYO7PRHmgjPw2s4PMk0ZsVek8+qHvcEPUQ==","signatures":[{"sig":"MEQCIBc4EyTyDPxGeiphiQXT1qpeS+mCaUHl6qilHRS1qI3HAiAoZ3K4Ue5cB2lBGkh/yOiTZiXuFKG7Od2NrWclyxW6Sg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26013},"type":"module","exports":{".":"./dist/finite-field.js","./p3mod4":"./dist/p3mod4/finite-field.js"},"gitHead":"260f74d1923baa53d0e65ba68381f319fe70dcf6","scripts":{"bump-patch":"npm version patch && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"_npmVersion":"10.9.2","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","directories":{},"_nodeVersion":"22.16.0","_hasShrinkwrap":false,"devDependencies":{"ff1":"npm:@bradthomasbrown/finite-field@^1.1.0"},"_npmOperationalInternal":{"tmp":"tmp/finite-field_2.0.5_1766227615770_0.9605050059789875","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@bradthomasbrown/finite-field","description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","version":"2.0.6","author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"type":"module","scripts":{"bump-patch":"npm version patch && git push && npm publish --access=public","prepublishOnly":"bun test.ts"},"exports":{".":"./dist/finite-field.js","./p3mod4":"./dist/p3mod4/finite-field.js"},"devDependencies":{"ff1":"npm:@bradthomasbrown/finite-field@^1.1.0"},"_id":"@bradthomasbrown/finite-field@2.0.6","gitHead":"fa60ec7c6e3b204fb1d5cf1cb331ed0b890198cc","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-0in7LXWOwRZsKVmJU+7AnBsBQIbQUSXTl6K4dca69MX6lzMSQItap5X3Pvu49ZhKt3G8gMPJMrZd85+Fs5PGxg==","shasum":"126d92386958d37ca9edbfeff577b52f91e68aa0","tarball":"https://registry.npmjs.org/@bradthomasbrown/finite-field/-/finite-field-2.0.6.tgz","fileCount":8,"unpackedSize":26082,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCM990Y1BxCbte3OiPuvUgGFlPjqW5o/l74ooZxlrWwaQIgDpfsylIT02yzE2bWq3jfkRztsKRZ2tR/e4iZ3R6cab8="}]},"_npmUser":{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"},"directories":{},"maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/finite-field_2.0.6_1767360936861_0.8176877220638166"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-07T03:20:59.839Z","modified":"2026-01-02T13:35:37.207Z","1.0.0":"2025-12-07T03:21:00.166Z","1.0.1":"2025-12-07T03:35:21.349Z","1.1.0":"2025-12-13T00:28:21.422Z","2.0.0":"2025-12-20T03:40:27.161Z","2.0.1":"2025-12-20T03:54:17.756Z","2.0.2":"2025-12-20T05:10:05.846Z","2.0.3":"2025-12-20T05:16:28.789Z","2.0.4":"2025-12-20T05:58:58.306Z","2.0.5":"2025-12-20T10:46:55.911Z","2.0.6":"2026-01-02T13:35:36.993Z"},"author":{"name":"Brad Brown","email":"https://t.me/bradthomasbrown"},"description":"Minimal, unoptimized, and unaudited finite field library in JavaScript/TypeScript.","maintainers":[{"name":"bradthomasbrown","email":"bradthomasbrown@outlook.com"}],"readme":"# finite-field\r\nThis is a simple, minimal implementation of finite field arithmetic in TypeScript/JavaScript. \r\n\r\n## Why?\r\nThere is surprisingly little information on all aspects of the \"cryptographic stack\" in JavaScript and elsewhere that is simple and minimal. This repository is part of a series of repositories that builds up this stack from first principles, including:\r\n- Finite field arithmetic (this repository)\r\n- [Elliptic curves over finite fields](https://github.com/bradthomasbrown/finite-curve)\r\n- Sponge constructions\r\n- Keccak\r\n- The concrete instances of secp256k1, Keccak-256, and more as well as how these are made from the above concepts\r\n- ECDSA\r\n- Interacting with EVM nodes\r\n- And potentially more\r\n\r\n## Installation\r\n```sh\r\nnpm i @bradthomasbrown/finite-field\r\n```\r\n\r\n## Usage\r\n```js\r\nimport { FiniteField } from \"@bradthomasbrown/finite-field\";\r\n\r\nconst p = 7;\r\nconst q =\r\n      (1n << 256n)\r\n    - (1n << 32n)\r\n    - 977n;\r\n\r\nconst F = new FiniteField(p);\r\nconst G = new FiniteField(q);\r\n\r\nconsole.log(FiniteField.subtract(13, 0, 1));\r\n// 12n\r\n\r\nconsole.log(F.add(5, 6));\r\n// 4n\r\n\r\nconsole.log(F.multiply(5, 6));\r\n// 2n\r\n\r\nconst inverse_3 = G.inverse(3);\r\nconst reciprocal_3 = G.reciprocal(3);\r\n\r\nconsole.log(inverse_3);\r\n// 115792089237316195423570985008687907853269984665640564039457584007908834671660n\r\n\r\nconsole.log(reciprocal_3);\r\n// 77194726158210796949047323339125271902179989777093709359638389338605889781109n\r\n\r\nconsole.log(G.add(inverse_3, 3));\r\n// 0n\r\n\r\nconsole.log(G.multiply(reciprocal_3, 3));\r\n// 1n\r\n```","readmeFilename":"README.md"}