{"id":24233355,"url":"https://github.com/memes/pi","last_synced_at":"2026-04-28T01:05:55.686Z","repository":{"id":31876533,"uuid":"104232928","full_name":"memes/pi","owner":"memes","description":"Generate the digits of pi given an offset into the mantissa","archived":false,"fork":false,"pushed_at":"2026-04-27T22:58:11.000Z","size":16932,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-27T23:22:02.381Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","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/memes.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-09-20T15:22:24.000Z","updated_at":"2026-04-27T22:57:31.000Z","dependencies_parsed_at":"2023-02-16T04:31:32.881Z","dependency_job_id":"acb56c2a-2cd0-49c6-847f-e022ae09ed29","html_url":"https://github.com/memes/pi","commit_stats":null,"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/memes/pi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memes%2Fpi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memes%2Fpi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memes%2Fpi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memes%2Fpi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/memes","download_url":"https://codeload.github.com/memes/pi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/memes%2Fpi/sbom","scorecard":{"id":636188,"data":{"date":"2025-08-11","repo":{"name":"github.com/memes/pi","commit":"fc57d2c1be4fda3c078428fdd582ed25667ddf9e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6.4,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":5,"reason":"Found 1/2 approved changesets -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/go-lint.yml:14","Info: topLevel 'pull-requests' permission set to 'read': .github/workflows/go-lint.yml:15","Info: topLevel 'contents' permission set to 'read': .github/workflows/pre-commit.yml:15","Info: topLevel 'pull-requests' permission set to 'read': .github/workflows/pre-commit.yml:16","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release-please.yml:12","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release.yml:12","Warn: topLevel 'packages' permission set to 'write': .github/workflows/release.yml:13","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-lint.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/go-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-lint.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/go-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-lint.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/go-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-lint.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/go-lint.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go-lint.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/go-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-lint.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/go-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go-lint.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/go-lint.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pre-commit.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/pre-commit.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pre-commit.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/pre-commit.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pre-commit.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/pre-commit.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pre-commit.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/pre-commit.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pre-commit.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/pre-commit.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-please.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release-please.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:47: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/stale.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/memes/pi/stale.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Info:   0 out of  12 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  10 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:17"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":8,"reason":"3 out of the last 3 releases have a total of 3 signed artifacts.","details":["Info: signed release artifact: pi_2.0.9_SHA256SUMS.sig: https://github.com/memes/pi/releases/tag/v2.0.9","Info: signed release artifact: pi_2.0.8_SHA256SUMS.sig: https://github.com/memes/pi/releases/tag/v2.0.8","Info: signed release artifact: pi_2.0.7_SHA256SUMS.sig: https://github.com/memes/pi/releases/tag/v2.0.7","Warn: release artifact v2.0.9 does not have provenance: https://api.github.com/repos/memes/pi/releases/232995644","Warn: release artifact v2.0.8 does not have provenance: https://api.github.com/repos/memes/pi/releases/205041992","Warn: release artifact v2.0.7 does not have provenance: https://api.github.com/repos/memes/pi/releases/192508543"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":10,"reason":"SAST tool detected","details":["Info: SAST configuration detected: Hadolint","Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T09:13:39.757Z","repository_id":31876533,"created_at":"2025-08-21T09:13:39.757Z","updated_at":"2025-08-21T09:13:39.757Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32361478,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"ssl_error","status_checked_at":"2026-04-27T20:07:00.910Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":[],"created_at":"2025-01-14T16:01:13.522Z","updated_at":"2026-04-28T01:05:55.680Z","avatar_url":"https://github.com/memes.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fractional digits of pi, v2\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/memes/pi/v2.svg)](https://pkg.go.dev/github.com/memes/pi/v2)\n[![Go Report Card](https://goreportcard.com/badge/github.com/memes/pi/v2)](https://goreportcard.com/report/github.com/memes/pi/v2)\n![GitHub release](https://img.shields.io/github/v/release/memes/pi?sort=semver)\n![GitHub last commit](https://img.shields.io/github/last-commit/memes/pi)\n[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-3.0-4baaaa.svg)](CODE_OF_CONDUCT.md)\n\nA simple distributed computing example that calculates the fractional decimal digit of\n\u0026#x1D745; at the requested index.\n\nThis library and sample application demonstrates one way the problem of calculating\nthe subset N fractional decimal digits of pi could be distributed amongst workers\ncalculating sections of pi independently, and in parallel.\n\nContributions are welcome! Please review [Contributions](CONTRIBUTING.md) for\nmore information.\n\n## Sample Application\n\n\u003e NOTE: The intent of this application is to demonstrate distributed computing\n\u003e and scaling. There are better ways to calculate pi to arbitrary precision if\n\u003e speed or accuracy is required!\n\nThe bundled application assembles the digits of pi through multiple requests to\nservices that return a single fractional digit. This generates a fair amount of\nnetwork traffic and is sufficient to demonstrate various autoscaling options in\npublic cloud and Kubernetes scenarios.\n\nSee [Background](#background) below for more details on the algorithm used to\ncalculate the digits of pi.\n\n### pi client\n\nImplements a simple gRPC client that will attempt to make multiple requests\nto pi server instances available at the provided endpoint, and concatenate the\nresponses into a an output.\n\nE.g. to request the first 250 fractional digits of pi from an [insecure](#tls-mutual-tls-and-grpc-authorities) gRPC server\nrunning at `localhost:8443`:\n\n```shell\npi client collate --count 250 --max-timeout 25s --insecure localhost:8443\n```\n\n```text\nResult is: 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091\n```\n\nUse `pi help client` to see the full set of options available to the client.\n\n### pi server\n\nLaunches a service that listens for incoming gRPC (and REST) requests and returns\nthe matching digit, optionally from a Redis cache. If there is a cache-miss, the\nservice calculates the digits using the library function in [pi/v2].\n\nE.g. to launch the server with verbose logging\n\n```shell\npi server --verbose\n```\n\nUse `pi help server` to see the full set of options available to the client.\n\n#### Enable the REST gateway\n\nThe `pi server` can optionally enable an embedded REST-to-gRPC gateway to expose\na generated REST API for the service. The gateway is enabled by specifying the\n`--rest-address` that the HTTP/1 service will bind to.\n\nA generated OpenAPI v2 definition can be retrieved from the REST endpoint\nat `/api/v2/swagger.json`.\n\nFor example, using a `pi server` with REST gateway on port 8080 and [httpie] as\na client:\n\n```shell\npi server --rest-address :8080 --annotation foo=bar --tag red\n```\n\n```shell\nhttp :8080/api/v2/digit/0\n```\n\n```text\nHTTP/1.1 200 OK\nContent-Length: 116\nContent-Type: application/json\nDate: Tue, 19 Apr 2022 05:00:54 GMT\nGrpc-Metadata-Content-Type: application/grpc\n\n{\n    \"digit\": 1,\n    \"index\": \"0\",\n    \"metadata\": {\n        \"annotations\": {\n            \"foo\": \"bar\"\n        },\n        \"identity\": \"server.example.com\",\n        \"tags\": [\n            \"red\"\n        ]\n    }\n}\n```\n\n### OpenTelemetry metrics and traces\n\nBoth `pi server` and `pi client` support an optional flag to set an OpenTelemetry\ncollector where span and metric data will be sent, annotated with any `tags` or\n`annotations` set on the `pi server`. Use the `--otlp-target` flag with an\n`[address:]port` specifier to send telemetry to a collector.\n\nE.g.\n\n```shell\npi server --otlp-target collector:4317 --otlp-insecure\n```\n\n### TLS, mutual TLS, and gRPC authorities\n\ngRPC connections initiated by a client are expected to be served by a receiver\nwith a verifiable TLS certificate, which matches the DNS name or address of the\nserver endpoint. If `pi server` is using a certificate issued by a CA with a trusted\ncertificate, or is deployed behind a load balancer that is terminating TLS with\na trusted certificate, `pi client` should be able to establish a secure gRPC\nconnection without further configuration. There are flags that can change the\nbehavior of the application; see `pi help client` and/or `pi help server` for\nall the configuration options.\n\n## Binaries\n\nBinaries are published on the [Releases] page for Linux, macOS, and Windows. If\nyou have Go installed locally, `go install github.com/memes/pi/v2/cmd/pi@latest`\nwill download and install to *$GOBIN*.\n\nA container image is also published to Docker Hub and GitHub Container Registries\nthat can be used in place of the binary; just append the arguments to the\n`docker run` or `podman run` command.\n\nE.g. to run the latest v2 `pi server` with verbose logging, and with metrics and\ntraces published to an OpenTelemetry gRPC collector at `collector:4317`:\n\n```sh\npodman run --rm ghcr.io/memes/pi:2 server --verbose --verbose --otlp-target collector:4317\n```\n\n## Verifying releases\n\nFor each tagged release, an tarball of the source and a [syft] SBOM is created,\nalong with SHA256 checksums for all files. [cosign] is used to automatically generate\na signing certificate for download and verification of container images.\n\n### Verify release files\n\n1. Download the checksum, signature, and signing certificate file from GitHub\n\n   ```shell\n   curl -sLO https://github.com/memes/pi/releases/download/v2.0.1/pi_2.0.1_SHA256SUMS\n   curl -sLO https://github.com/memes/pi/releases/download/v2.0.01/pi_2.0.1_SHA256SUMS.sig\n   curl -sLO https://github.com/memes/pi/releases/download/v2.0.1/pi_2.0.1_SHA256SUMS.pem\n   ```\n\n2. Verify the SHA256SUMS have been signed with [cosign]\n\n   ```shell\n   cosign verify-blob --cert pi_2.0.1_SHA256SUMS.pem --signature pi_2.0.1_SHA256SUMS.sig pi_2.0.1_SHA256SUMS\n   ```\n\n   ```text\n   verified OK\n   ```\n\n3. Download and verify files\n\n   Now that the checksum file has been verified, any other file can be verified using `sha256sum`.\n\n   For example\n\n   ```shell\n   curl -sLO https://github.com/memes/pi/releases/download/v2.0.1/pi-2.0.1.tar.gz.sbom\n   curl -sLO https://github.com/memes/pi/releases/download/v2.0.1/pi_2.0.1_linux_amd64\n   sha256sum --ignore-missing -c pi_2.0.1_SHA256SUMS\n   ```\n\n   ```text\n   pi-2.0.1.tar.gz.sbom: OK\n   pi_2.0.1_linux_amd64: OK\n   ```\n\n### Verify container image\n\nUse [cosign]s experimental OCI signature support to validate the container.\n\n```shell\nCOSIGN_EXPERIMENTAL=1 cosign verify ghcr.io/memes/pi:v2.0.1\n```\n\n## Background\n\nUsing a [Bailey-Borwein-Plouffe] spigot algorithm, any 9 consecutive digits of pi\ncan be calculated without knowledge of the digits that preceded them. This allows\nthe development of a solution for a sequence of pi digits that appears to be\n[embarrassingly parallel].\n\nI.e. the first 18 fractional decimal digits of pi are `141592653` `589793238`.\nExecuting `BBPDigits(n)` function in [pi.go](pi.go) for `n = [0...9]` will return\nthese results.\n\n| index | result |\n| ----- | ------ |\n| **0** | **141592653** |\n| 1 | 415926535 |\n| 2 | 159265358 |\n| 3 | 592653589 |\n| 4 | 926535897 |\n| 5 | 265358979 |\n| 6 | 653589793 |\n| 7 | 535897932 |\n| 8 | 358979323 |\n| **9** | **589793238** |\n\nFrom this, we can see that generating the first 18 fractional digits of pi can be\nachieved by concatenating the results of `BBPDigits(0)` and `BBPDigits(9)`, and\ncan be extended to any arbitrary number of fractional digits by requesting the\nnext 9 digits, and so on.\n\nPseudo-code:\n\n```pseudo\ndigits = \"\"\nfor i = 0; i \u003c N; i += 9 {\n    digits += BBPDigits(i)\n}\nprint digits\n```\n\n[Bailey-Borwein-Plouffe]: https://en.wikipedia.org/wiki/Bailey%E2%80%93Borwein%E2%80%93Plouffe_formula\n[embarrassingly parallel]: https://en.wikipedia.org/wiki/Embarrassingly_parallel\n[httpie]: https://github.com/httpie/httpie\n[Releases]: https://github.com/memes/pi/releases\n[cosign]: https://github.com/SigStore/cosign\n[syft]: https://github.com/anchore/syft\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmemes%2Fpi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmemes%2Fpi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmemes%2Fpi/lists"}