leo/examples/hackers-delight/ntzloops
Collin Chin d44457fc32
[Feature] Implement leo execute (#2491)
* bump snarkvm rev

* update default gitignore

* impl leo execute

* bump snarkvm 0.14.5

* modify examples wip

* update run.sh examples

* impl env file

* clippy warning

* fix auction example

* fix auction example env

* generate new private key for new env - tests failing due to env not found err

* commit error changes

* Fix tests; clippy

* Get examples working

* leo build checks that build dir is well formed; clippy

* Clean up

* Update examples/README.md

Co-authored-by: d0cd <pranavsaig@gmail.com>
Signed-off-by: Collin Chin <16715212+collinc97@users.noreply.github.com>

* do not commit .avm files

* use snarkvm commands

---------

Signed-off-by: Collin Chin <16715212+collinc97@users.noreply.github.com>
Co-authored-by: Pranav Gaddamadugu <pranav@aleo.org>
Co-authored-by: d0cd <pranavsaig@gmail.com>
2023-07-19 18:04:09 -07:00
..
build [Feature] Implement leo execute (#2491) 2023-07-19 18:04:09 -07:00
inputs Reorganize hackers delight examples 2022-09-13 17:22:01 +02:00
src More examples 2022-10-06 00:17:51 -07:00
.env [Feature] Implement leo execute (#2491) 2023-07-19 18:04:09 -07:00
.gitignore [Feature] Implement leo execute (#2491) 2023-07-19 18:04:09 -07:00
program.json [Feature] Implement leo execute (#2491) 2023-07-19 18:04:09 -07:00
README.md Reorganize hackers delight examples 2022-09-13 17:22:01 +02:00

src/ntzloops.leo

Build Guide

To compile and run this Leo program, run:

leo run

The Algorithm

This algorithm is described in "Hacker's Delight, 2nd edition" by Henry S. Warren, section 5-4, figure 5-23, as a simple loop for counting number of trailing zeros that is fast (on traditional architectures) when the number of trailing zeros is small. In that same figure, in the end-of-line comments, there is code for an analogous simple loop that is fast when the number of trailing zeros is large.

We start out by using the C idiom ~x & (x - 1) to create a word with 1-bits at the positions of the trailing zeros in x and 0-bits elsewhere. If there are no trailing zeros in x, the formula returns zero. This idiom is expressed in Leo as !x & x.sub_wrapped(1u32);.

Then we simply count the 1-bits by right shifting until x is zero and counting the number of shifts using the variable n.

To get the effect of a while loop in Leo, one must use a for loop with the enough iterations to accommodate all possible inputs, and then check the while condition within the for loop. Once the condition is false, the loop continues until finished but the if statement inside the loop prevents any further operations.