Table of contents
Problem
Write a program poly.cairo that computes the expression:
$$ x^3 + 23x^2+ 45x + 67 = 0, x = 100 $$
After the program ends, the value should be at [ap - 1].
For this exercise, you may assume that the fp register is constant and initialized to the same value as ap.
Link to the problem in Cairo documentation
Solution
%lang starknet
func compute_poly() -> felt {
[ap] = 100, ap++;
[ap] = [ap - 1] + 23, ap++;
[ap] = [ap - 2] * [ap - 1], ap++;
[ap] = [ap - 1] + 45, ap++;
[ap] = [ap - 1] * [ap - 4], ap++;
[ap] = [ap - 1] + 67, ap++;
ret;
}
Explain the solution
Cairo receives instructions and operates on memory cells that are immutable and can hold one value. Therefore, first, we need to factor our equation to make instructions for each memory cell.
$$ x(x(x + 23) + 45) + 67 = 0, x = 100 $$
x: [ap] = 100, ap++;
Here we tell Cairo to put 100 to the memory cell at address ap
, then we move to the next memory cell by ap++
Note: ap
is the allocation pointer pointing to the available memory cells. Read more about it here
x + 23: [ap] = [ap - 1] + 23, ap++
Now we are at the second memory cell. To refer to the value of x which is in the first cell, we use [ap - 1]
. We also move the pointer to the next cell by ap++
.
x(x+23): [ap] = [ap - 2] * [ap - 1] , ap++
At this step, we get the product of x which is 2 memory cells before the pointer and the previous memory cell's value x + 3. Then we call ap++
again to move to the next cell.
We continue to do the same for the rest of our equation:
x(x + 23) + 45: [ap] = [ap - 1] + 45, ap++;
x(x(x + 23) + 45): [ap] = [ap - 1] * [ap - 4], ap++ ;
x(x(x + 23) + 45) + 67: [ap] = [ap - 1] + 67, ap++;
Test
test_poly.cairo
%lang starknet
from src.poly import compute_poly
@external
func test_compute_poly() {
let res = compute_poly();
assert res = 1234567;
return ();
}
Run protostar test tests/test_poly.cairo
to test the function.
Conclusion
In this article, I've shown how to instruct Cairo to compute a polynomial equation. The more I understand Cairo, the more fascinating it becomes to me. Keep on learning!
If you have any questions, feel free to DM me on Twitter. I would love to talk.