The Smarandache prime-digital sequence (SPDS for brevity) is the sequence of primes whose digits are themselves prime.

For example 257 is an element of this sequence because it is prime itself and its digits: 2, 5 and 7 are also prime.

Task
 Show the first 25 SPDS primes.
 Show the hundredth SPDS prime.


See also

 OEIS A019546: Primes whose digits are primes.
 https://www.scribd.com/document/214851583/On-the-Smarandache-prime-digital-subsequence-sequences


program Smarandache;
 
uses
  sysutils,primsieve;// http://rosettacode.org/wiki/Extensible_prime_generator#Pascal
const
  Digits : array[0..3] of Uint32 = (2,3,5,7);
var
  i,j,pot10,DgtLimit,n,DgtCnt,v,cnt,LastPrime,Limit : NativeUint;
 
procedure Check(n:NativeUint);
var
  p : NativeUint;
Begin
  p := LastPrime;
  while p< n do
    p := nextprime;
  if p = n then
  begin
    inc(cnt);
    IF (cnt <= 25) then
    Begin
      IF cnt = 25 then
      Begin
        writeln(n);
        Limit := 100;
      end
      else
        Write(n,',');
    end
    else
      IF cnt = Limit then
      Begin
        Writeln(cnt:9,n:16);
        Limit *=10;
        if Limit > 10000 then
          HALT;
      end;
   end;
   LastPrime := p;
end;
 
Begin
  Limit := 25;
  LastPrime:=1;
 
//Creating the numbers not the best way but all upto 11 digits take 0.05s
//here only 9 digits
  i := 0;
  pot10 := 1;
  DgtLimit := 1;
  v := 4;
  repeat
    repeat
     j := i;
     DgtCnt := 0;
     pot10 := 1;
     n := 0;
     repeat
       n += pot10*Digits[j MOD 4];
       j := j DIV 4;
       pot10 *=10;
       inc(DgtCnt);
     until DgtCnt = DgtLimit;
     Check(n);
     inc(i);
   until i=v;
   //one more digit
   v *=4;
   i :=0;
   inc(DgtLimit);
 until DgtLimit= 12;
end.