{"id":35247572,"url":"https://github.com/thomasarmel/binary_polynomial_mod_algebra","last_synced_at":"2026-04-05T01:34:43.355Z","repository":{"id":274772428,"uuid":"923650003","full_name":"thomasarmel/binary_polynomial_mod_algebra","owner":"thomasarmel","description":"Basic algebra on univariate binary polynomial (over GF(2))","archived":false,"fork":false,"pushed_at":"2025-02-16T14:16:27.000Z","size":51,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-02T12:04:23.004Z","etag":null,"topics":["algebr","binary","cryptography","polynomial","univariate"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/binary_polynomial_mod_algebra","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thomasarmel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-28T16:17:52.000Z","updated_at":"2025-02-16T14:16:31.000Z","dependencies_parsed_at":"2025-01-29T10:26:01.064Z","dependency_job_id":"972f645d-ff9d-45b8-b8a1-892c4e3b4f02","html_url":"https://github.com/thomasarmel/binary_polynomial_mod_algebra","commit_stats":null,"previous_names":["thomasarmel/binary_polynomial_mod_algebra"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/thomasarmel/binary_polynomial_mod_algebra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasarmel%2Fbinary_polynomial_mod_algebra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasarmel%2Fbinary_polynomial_mod_algebra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasarmel%2Fbinary_polynomial_mod_algebra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasarmel%2Fbinary_polynomial_mod_algebra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thomasarmel","download_url":"https://codeload.github.com/thomasarmel/binary_polynomial_mod_algebra/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thomasarmel%2Fbinary_polynomial_mod_algebra/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31421869,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T00:25:07.052Z","status":"ssl_error","status_checked_at":"2026-04-05T00:25:05.923Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algebr","binary","cryptography","polynomial","univariate"],"created_at":"2025-12-30T06:04:51.418Z","updated_at":"2026-04-05T01:34:43.337Z","avatar_url":"https://github.com/thomasarmel.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Binary univariate polynomial algebra\n\n*This repo is highly inspired from https://gist.github.com/mildsunrise/e21ae2b1649532813f2594932f9e9371, and https://github.com/uranix/factormod*\n\n---\n\n## Installation\n\nOn your project's directory, run the following command:\n\n```bash\ncargo add binary_polynomial_mod_algebra\n```\n\n## Usage\n\n### Polynomial creation\n\nYou can create a `BinaryPolynomial` from `BigUint`, where the least significant bit is the lowest degree coefficient.\n\n```rust\nuse num_bigint::BigUint;\nuse binary_polynomial_mod_algebra::BinaryPolynomial;\n\nlet polynomial = BinaryPolynomial::from(BigUint::from(13u32)); // or 0b1101u32\nassert_eq!(polynomial.to_string(), \"x^3 + x^2 + 1\");\n```\n\nYou can also create a `BinaryPolynomial` from a `Vec\u003cbool\u003e`, where the first element is the highest degree coefficient.\n\n```rust\nuse binary_polynomial_mod_algebra::BinaryPolynomial;\n\nlet polynomial = BinaryPolynomial::from(vec![true, true, false, true]);\nassert_eq!(polynomial.to_string(), \"x^3 + x^2 + 1\");\n```\n\nOr from a `\u0026str`:\n```rust\nuse binary_polynomial_mod_algebra::BinaryPolynomial;\nlet polynomial = BinaryPolynomial::try_from(\"x^4 + x + 1\").unwrap();\nassert_eq!(polynomial.to_string(), \"x^4 + x + 1\");\n```\n\n\nFinally, you can create the null or unitary BinaryPolynomial:\n\n```rust\nuse binary_polynomial_mod_algebra::BinaryPolynomial;\nuse num_traits::identities::One;\nuse num_traits::Zero;\n\nlet polynomial = BinaryPolynomial::zero();\nassert_eq!(polynomial.to_string(), \"0\");\n\nlet polynomial = BinaryPolynomial::one();\nassert_eq!(polynomial.to_string(), \"1\");\n```\n\n### Non-zero polynomial\n\nSome functions require a `NonZeroBinaryPolynomial` argument, you can create it from a `BinaryPolynomial`:\n\n```rust\nuse binary_polynomial_mod_algebra::BinaryPolynomial;\nuse binary_polynomial_mod_algebra::NonZeroBinaryPolynomial;\nuse num_traits::identities::Zero;\n\nlet zero_polynomial = BinaryPolynomial::zero();\nlet try_non_zero_polynomial = NonZeroBinaryPolynomial::new(zero_polynomial);\nassert!(try_non_zero_polynomial.is_none());\n\nlet non_zero_polynomial = BinaryPolynomial::from(vec![true, true, false, true]);\nlet non_zero_polynomial = NonZeroBinaryPolynomial::new(non_zero_polynomial).unwrap();\nassert!(non_zero_polynomial.get().to_string() == \"x^3 + x^2 + 1\");\n```\n\n#### Example\n\nPolynomial inversion modulo a non-zero polynomial:\n\n```rust\nuse binary_polynomial_mod_algebra::BinaryPolynomial;\nuse binary_polynomial_mod_algebra::NonZeroBinaryPolynomial;\n\nlet polynomial = NonZeroBinaryPolynomial::new(\n        BinaryPolynomial::from(vec![true, false, true, true]) // x^3 + x + 1\n    ).unwrap();\nlet modulo = NonZeroBinaryPolynomial::new(\n        BinaryPolynomial::from(vec![true, false, false, false, true]) // x^4 + 1\n    ).unwrap();\nlet inverse = polynomial.inv_mod(\u0026modulo);\nassert!(inverse.is_some()); // Inverse exists\nassert_eq!(inverse.unwrap().to_string(), \"x^3 + x + 1\");\n```\n\n### Operators\n\nYou can use the following operators:\n\n| Operator | operand 1                 | operand 2                  | Description                                                                              |\n|----------|---------------------------|----------------------------|------------------------------------------------------------------------------------------|\n| `+`      | `BinaryPolynomial`        | `BinaryPolynomial`         | Polynomial addition\u003cbr/\u003e(equivalent to XOR)                                              |\n| `*`      | `BinaryPolynomial`        | `BinaryPolynomial`         | Polynomial multiplication\u003cbr/\u003e(without modulo, use `mul_mod` for modular multiplication) |\n| `*`      | `NonZeroBinaryPolynomial` | `NonZeroBinaryPolynomial`  | Polynomial multiplication\u003cbr/\u003e(without modulo, use `mul_mod` for modular multiplication) |\n| `%`      | `BinaryPolynomial`        | `NonZeroBinaryPolynomial`  | Polynomial modulo                                                                        |\n| `/`      | `BinaryPolynomial`        | `NonZeroBinaryPolynomial`  | Polynomial division\u003cbr/\u003e(returns quotient)                                               |\n| `pow`    | `BinaryPolynomial`        | `usize`                    | Polynomial exponentiation\u003cbr/\u003e(without modulo, use `pow_mod` for modular exponentiation) |\n\n\n### Available operations\n\n\u003e div_mod(BinaryPolynomial, modulo: NonZeroBinaryPolynomial)\n\u003e\u003e Returns quotient and modulo\n\n\u003e mul_mod(BinaryPolynomial, BinaryPolynomial, modulo: NonZeroBinaryPolynomial)\n\u003e\u003e Multiplication modulo\n\n\u003e pow_mod(BinaryPolynomial, BinaryPolynomial, modulo: NonZeroBinaryPolynomial)\n\u003e\u003e Exponentiation modulo\n\n\u003e congruent_mod(BinaryPolynomial, BinaryPolynomial, modulo: NonZeroBinaryPolynomial)\n\u003e\u003e Check if polynomials are congruent modulo\n\n\u003e derivative(BinaryPolynomial)\n\u003e\u003e Returns polynomial derivative\n\n\u003e coprime(NonZeroBinaryPolynomial, NonZeroBinaryPolynomial)\n\u003e\u003e Check if two polynomials are coprime\n\n\u003e gcd(NonZeroBinaryPolynomial, NonZeroBinaryPolynomial)\n\u003e\u003e Returns greatest common divisor of two polynomials\n\n\u003e egcd(NonZeroBinaryPolynomial, NonZeroBinaryPolynomial)\n\u003e\u003e Returns extended greatest common divisor of two polynomials\n\n\u003e inv_mod(NonZeroBinaryPolynomial, modulo: NonZeroBinaryPolynomial)\n\u003e\u003e Returns modular inverse of a polynomial\n\n\u003e is_irreducible(NonZeroBinaryPolynomial)\n\u003e\u003e Check if polynomial is irreducible using Rabin's irreducibility test\n\n\u003e is_primitive(NonZeroBinaryPolynomial)\n\u003e\u003e Check if polynomial is primitive\n\n\u003e irreducible_factors(NonZeroBinaryPolynomial)\n\u003e\u003e Compute irreducible factors of polynomial using Berlekamp's algorithm\n\n\u003e square_free_irreducible_factors(NonZeroBinaryPolynomial)\n\u003e\u003e Compute irreducible factors of square free polynomial\n\n\u003e is_square_free(NonZeroBinaryPolynomial)\n\u003e\u003e Check if polynomial is square free","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthomasarmel%2Fbinary_polynomial_mod_algebra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthomasarmel%2Fbinary_polynomial_mod_algebra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthomasarmel%2Fbinary_polynomial_mod_algebra/lists"}