circular_autocorrelation
std.seq.circular_autocorrelation · Level L4The circular autocorrelation of a real signal, rₖ = Σⱼ xⱼ·x₍ⱼ₊ₖ₎ mod n, by the Wiener–Khinchin theorem: the inverse transform of the power spectrum.
Signature
circular_autocorrelation(x: f64[n]) → f64[n]
Structure
The function as NOVA stores it: one box per input, operation and output, and arrows that carry values. A double border marks another library function this one runs — called once, or by Scan once per element; select it to open that function.
- input
- operation
- constant
- call
- output
Verification
- Signature proven by NOVA’s shape solver, for every size.
- Agrees with the reference
Σⱼ x[j]·x[(j + k) mod n], summed directlyto 80 digits (100-digit arithmetic), on all 40 test cases. - All 143 float64 results inside the running error bound; the closest uses 36% of it.
- Interpreter and NumPy backend return bit-identical results.
- correctly rounded (the float64 nearest the exact value)
- 46%
- bit-equal to the NumPy formula in float64
- 45%
- largest error, in units in the last place
- 1.9e+8
Large ulp counts appear where a result is tiny next to the numbers it is computed from (after cancellation, for example), so one unit in the last place is tiny too; the absolute error is still inside the bound. Results within their own error of zero are not counted.
Note
The reference is the correlation sum itself, with no transform at all.
Identity
sha256:f81611b049ad6ee54bd4388f28621ace99896072a3d2fd7ac71b50e03b2ea744The semantic hash of the graph. It changes when the program changes, and never when only its documentation does.
Control handle
- Symbol
- Ω:std.seq.circular_autocorrelation · Ω:circular_autocorrelation
- Pins
sha256:47fdcf1735229540954f2e56714c2da28e765b4877f41cc185b6c4f7475b4e66this graph alone- Evidence
sha256:2ca12f61a56e7f53123924604c4ab4f0867accc96b4c752855db0a1a30ce198dthe hash of its verification record- Needs
- no capability: a pure function
Through NOVA’s control layer, the symbol launches this function only while the program still matches what it pins: a change to this graph, or to any graph it reaches, needs a migration first.