#include <stdio.h>


p(n,i,z){return--i?p(n,i,z*i*i%n):z%n;} //is n prime?
c;
f(a,i,n)int*a;{
	return i<0||i/n ? c //are we out of array -> return # of steps
	  :c++>n ? 0  //Did we move more than n-times? -> We can't escape (Pigeonhole principle)
	    :i&&p(i,i,1) ? f(a,i-a[i],n) //is index i a prime? -> move left
	      : f(a,a[i],n);  // move right
}    


int main(void) {
	int a[] = {2,5,6,8,1,2,3};
	int b[] = {2,0,2};
	int x[] = {14,1,2,5,1,3,51,5,12,3,4,41,15,4,12,243,51,2,14,51,12,11};
	printf("%d\n", f(a,3, sizeof(a)/sizeof(*a)));
	c = 0;
	printf("%d\n", f(b,2, sizeof(b)/sizeof(*b)));
	c = 0;
	printf("%d\n", f(x,5, sizeof(x)/sizeof(*x)));
	return 0;
}
