Problem:
ゴールドバッハ予想

ゴールドバッハ予想とは「6 以上のどんな偶数も、2 つの素数 (*1) の和として表わすことができる」というものです。

たとえば、偶数の 12 は 12 = 5 + 7 、18 は 18 = 5 + 13 = 7 + 11 などと表すことができます。

和が 134 となる 2 つの素数の組み合せをすべて書き出すと、以下の通りとなります。

134 = 3+131 = 7+127 = 31+103 = 37+97 = 61+73 = 67+67

= 131+3 = 127+7 = 103+31 = 97+37 = 73+61

与えられた数が大きくなると、いくらでも素数の組み合せが見つかるような気がします。しかし、現代数学をもってしてもこの予想を証明することも、反例を作ることもできません(*2)。ちょっと不思議な感じがしますね。

そこで、ゴールドバッハ予想を鑑賞するために、偶数 n を入力とし、和が n となる 2 つの素数の組み合せの数を求めるプログラムを作成してください。

和が n となる素数の組み合せの数とは n = p + q かつ p ≤ q であるような正の素数 p, q の組み合せの数です。上の例からわかるように和が 134 となる素数の組み合せは6 個です。

(*1) 素数とは、1 または自分自身以外に約数を持たない整数のことである。なお、1 は素数ではない。

(*2) 2007 年 2 月現在、5×1017 までの全ての偶数について成り立つことが確かめられている。(Wikipedia)

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。 各データセットとして、１つの偶数 n (6 ≤ n ≤ 1000000) が１行に与えられます。

データセットの数は 500 を超えません。

Output

データセット毎に素数の組み合せの数を１行に出力します。

Sample Input

134
4330
34808
98792
0

Output for the Sample Input

6
72
274
607

Solution in Rust (judge verdict: Accepted)

/*input
134
4330
34808
98792
0
*/
fn read_line() -> String {
    let mut return_ = format!("");
    std::io::stdin().read_line(&mut return_).ok();
    return_
}

fn main() {
    let mut prime_list: [bool; 1000001] = [true; 1000001];
    let mut multiple;
    prime_list[0] = false;
    for i in 2..1000001 {
        if prime_list[i] {
            multiple = i.pow(2);
            while multiple < 1000001 {
                prime_list[multiple as usize] = false;
                multiple = multiple + i;
            }
        }
    }
    /*
    Let A be an array of Boolean values, indexed by integers 2 to n, initially all set to true.

    for i = 2, 3, 4, ..., not exceeding √n:
      if A[i] is true:
        for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n:
          A[j] := false.
    */
    let mut input: u32;
    let mut total: u32;
    loop {
        input = read_line().trim().parse().expect("");
        if input == 0 {
            break;
        }
        /*
        for i in range(num//2 + 1):
        if num % 2 != 0:
            print(num, 'not even'); break
        if i in primes and (num - i) in primes:
            print(i, '+', num - i)
        */
        total = 0;
        //println!("{:?}", input / 2 + 1);
        for i in 2..((input / 2) + 1) {
            if prime_list[i as usize] && prime_list[(input - i) as usize] {
                total = total + 1;
            }
        }
        println!("{}", total);
    }
}