/- Copyright 2026 The Formal Conjectures Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -/ import FormalConjecturesUtil

A generalized Stern sequence

A112970: A generalized Stern sequence, defined by the recurrence relations: $a(2n+1) = a(n)$ and $a(2n) = a(n) + a(n-2)$ with $a(0)=1$, $a(1)=1$ and $a(n)=0$ for $n \le -1$.

References:

namespace OeisA112970

a n is the generalized Stern sequence, defined by the recurrence relations: $a(2n+1) = a(n)$ and $a(2n) = a(n)$ + $a(n-2)$ with $a(0) = 1$, $a(1) = 1$ and $a(n) = 0$ for $n \le -1$.

def a (n : ) : := if n = 0 then 1 else if n = 1 then 1 else let k := n / 2 if n % 2 = 1 then -- Odd case: a(2k + 1) = a(k) a k else -- Even case: a(2k) = a(k) + a(k - 2) let aPrev : := -- a(m) is 0 if m < 0. Equivalent to checking k < 2 for the argument k-2. if k < 2 then 0 else a (k - 2) a k + aPrev termination_by n@[category test, AMS 11] theorem a_0 : a 0 = 1 := a 0 = 1 (if 0 = 0 then 1 else if 0 = 1 then 1 else have k := 0 / 2; if 0 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) = 1; All goals completed! 🐙@[category test, AMS 11] theorem a_1 : a 1 = 1 := a 1 = 1 (if 1 = 0 then 1 else if 1 = 1 then 1 else have k := 1 / 2; if 1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) = 1; All goals completed! 🐙@[category test, AMS 11] theorem a_2 : a 2 = 1 := a 2 = 1 (if 2 = 0 then 1 else if 2 = 1 then 1 else have k := 2 / 2; if 2 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) = 1; (if 2 = 0 then 1 else if 2 = 1 then 1 else have k := 2 / 2; if 2 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_1 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev) + aPrev) = 1; (if 2 = 0 then 1 else if 2 = 1 then 1 else have k := 2 / 2; if 2 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_1 := (k - 2) / 2; if (k - 2) % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) + aPrev) + aPrev) = 1; All goals completed! 🐙@[category test, AMS 11] theorem a_3 : a 3 = 1 := a 3 = 1 (if 3 = 0 then 1 else if 3 = 1 then 1 else have k := 3 / 2; if 3 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) = 1; (if 3 = 0 then 1 else if 3 = 1 then 1 else have k := 3 / 2; if 3 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_1 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev) + aPrev) = 1; All goals completed! 🐙@[category test, AMS 11] theorem a_4 : a 4 = 2 := a 4 = 2 (if 4 = 0 then 1 else if 4 = 1 then 1 else have k := 4 / 2; if 4 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) = 2; (if 4 = 0 then 1 else if 4 = 1 then 1 else have k := 4 / 2; if 4 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_1 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then a k_1 else have aPrev := if k_1 < 2 then 0 else a (k_1 - 2); a k_1 + aPrev) + aPrev) = 2; (if 4 = 0 then 1 else if 4 = 1 then 1 else have k := 4 / 2; if 4 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_1 := (k - 2) / 2; if (k - 2) % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then a k else have aPrev := if k < 2 then 0 else a (k - 2); a k + aPrev) + aPrev) + aPrev) = 2; (if 4 = 0 then 1 else if 4 = 1 then 1 else have k := 4 / 2; if 4 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev) + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_1 := (k - 2) / 2; if (k - 2) % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev) + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_1 := k / 2; if k % 2 = 1 then if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev else have aPrev := if k_1 < 2 then 0 else if k_1 - 2 = 0 then 1 else if k_1 - 2 = 1 then 1 else have k := (k_1 - 2) / 2; if (k_1 - 2) % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev; (if k_1 = 0 then 1 else if k_1 = 1 then 1 else have k := k_1 / 2; if k_1 % 2 = 1 then if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev else have aPrev := if k < 2 then 0 else if k - 2 = 0 then 1 else if k - 2 = 1 then 1 else have k_2 := (k - 2) / 2; if (k - 2) % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev; (if k = 0 then 1 else if k = 1 then 1 else have k_2 := k / 2; if k % 2 = 1 then a k_2 else have aPrev := if k_2 < 2 then 0 else a (k_2 - 2); a k_2 + aPrev) + aPrev) + aPrev) + aPrev) = 2; All goals completed! 🐙

Conjectures: a(2^n)=a(2^(n+1)+1)=A033638(n). This formalizes the equality a(2^n) = a(2^(n+1)+1).

@[category research solved, AMS 11, formal_proof using lean4 at "https://github.com/KitaKen1/oeis-a112970-formal-conjectures/blob/71ae72f443bd9bee7d958f0a19d9f9ec5ab82af5/lean/OeisA112970FC.lean#L43-L46"] theorem conjecture1 (n : ) : a (2^n) = a (2^(n + 1) + 1) := n:a (2 ^ n) = a (2 ^ (n + 1) + 1) All goals completed! 🐙

Conjectures: a(2^n-1)=a(32^n-1)=1. This formalizes the equality part a(2^n-1) = a(32^n-1).

@[category research solved, AMS 11, formal_proof using lean4 at "https://github.com/KitaKen1/oeis-a112970-formal-conjectures/blob/71ae72f443bd9bee7d958f0a19d9f9ec5ab82af5/lean/OeisA112970FC.lean#L56-L64"] theorem conjecture2 (n : ) : a (2^n - 1) = a (3 * 2^n - 1) := n:a (2 ^ n - 1) = a (3 * 2 ^ n - 1) All goals completed! 🐙

Conjectures: a(2^n-1)=a(3*2^n-1)=1. This formalizes the value part a(2^n-1)=1.

@[category research solved, AMS 11, formal_proof using lean4 at "https://github.com/KitaKen1/oeis-a112970-formal-conjectures/blob/71ae72f443bd9bee7d958f0a19d9f9ec5ab82af5/lean/OeisA112970FC.lean#L48-L54"] theorem conjecture3 (n : ) : a (2^n - 1) = 1 := n:a (2 ^ n - 1) = 1 All goals completed! 🐙end OeisA112970