/* First 100 Pi Digits in Picat. From "Fun With Num3ers": "First 100 Pi Digits| Forming primes" http://benvitalenum3ers.wordpress.com/2013/08/16/first-100-pi-digits-forming-primes/ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. % import cp. main => go. go => foreach(N in 1..8) Pi = [P.to_string() : P in pi(N)].flatten(), println(pi=Pi), All = [P : P in permutations(Pi), prime(P.parse_term())], println([n=N,All, len=All.length]) end, nl. % Another approach: slices go2 => % Pi = "3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067", Pi = [P.to_string() : P in pi(100)].flatten(), % converts to string println(pi=Pi), foreach(Len in 2..13) println(len=Len), foreach(P in [parse_term(I) : I in array_slice(Pi,Len)]) IsP = cond(prime(P),prime,no_prime), print([P,IsP]), nl end end, nl. % % slices an array A [...] into slices of length SliceLen % and returns a list List % array_slice(A, SliceLen) = List => List = [A2 : I in 1..A.length-SliceLen, A2 = [ A[J] : J in I..I+SliceLen-1] ]. % Get first Len digits of Pi pi(Len) = Res => Ndigits = 0, Q = 1, R = 0, T = Q, K = Q, N = 3, L = N, Res = "", C = 1, % counter for presentation while (C <= Len) if 4 * Q + R - T < N * T then Res := Res ++ [N], C := C + 1, Ndigits := Ndigits + 1, NR := 10 * (R - N * T), N := ((10 * (3 * Q + R)) // T) - 10 * N, Q := Q* 10, R := NR else NR := (2 * Q + R) * L, NN := (Q * (7 * K + 2) + R * L) // (T * L), Q := Q * K, T := T* L, L := L + 2, K := K+1, N := NN, R := NR end end, nl.