Very nice explanation of arithmetization in the context of zk-SNARKs!
For those who are curious about zk-STARKs in comparison:
Instead of translating each program into polynomial circuits (zk-SNARKs), for zk-STARKs you translate your program into assembly for the zk-STARK VM of choice, execute that program, and generate a proof from the execution trace table.
The arithmetization in the context of zk-STARKs happens over the VM assembly instructions.
So there's a set of polynomials that have a solution iff each VM state transition happened using a known instruction with that instruction's intended semantics (e.g. "'push' will increase the stack with one element", or "the clock count is increased by one").
Executing a program in a zk-STARK VM and generating a proof of execution does not involve constructing more polynomials.
For those who are curious about zk-STARKs in comparison:
Instead of translating each program into polynomial circuits (zk-SNARKs), for zk-STARKs you translate your program into assembly for the zk-STARK VM of choice, execute that program, and generate a proof from the execution trace table.
The arithmetization in the context of zk-STARKs happens over the VM assembly instructions.
So there's a set of polynomials that have a solution iff each VM state transition happened using a known instruction with that instruction's intended semantics (e.g. "'push' will increase the stack with one element", or "the clock count is increased by one").
Executing a program in a zk-STARK VM and generating a proof of execution does not involve constructing more polynomials.