Metamath Proof Explorer


Theorem bitsshft

Description: Shifting a bit sequence to the left (toward the more significant bits) causes the number to be multiplied by a power of two. (Contributed by Mario Carneiro, 22-Sep-2016)

Ref Expression
Assertion bitsshft ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) → { 𝑛 ∈ ℕ0 ∣ ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) } = ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) )

Proof

Step Hyp Ref Expression
1 simpll ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → 𝐴 ∈ ℤ )
2 2nn 2 ∈ ℕ
3 2 a1i ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → 2 ∈ ℕ )
4 simplr ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → 𝑁 ∈ ℕ0 )
5 3 4 nnexpcld ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( 2 ↑ 𝑁 ) ∈ ℕ )
6 5 nnzd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( 2 ↑ 𝑁 ) ∈ ℤ )
7 dvdsmul2 ( ( 𝐴 ∈ ℤ ∧ ( 2 ↑ 𝑁 ) ∈ ℤ ) → ( 2 ↑ 𝑁 ) ∥ ( 𝐴 · ( 2 ↑ 𝑁 ) ) )
8 1 6 7 syl2anc ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( 2 ↑ 𝑁 ) ∥ ( 𝐴 · ( 2 ↑ 𝑁 ) ) )
9 1 6 zmulcld ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( 𝐴 · ( 2 ↑ 𝑁 ) ) ∈ ℤ )
10 bitsuz ( ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) → ( ( 2 ↑ 𝑁 ) ∥ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ↔ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ⊆ ( ℤ𝑁 ) ) )
11 9 4 10 syl2anc ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( ( 2 ↑ 𝑁 ) ∥ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ↔ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ⊆ ( ℤ𝑁 ) ) )
12 8 11 mpbid ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ⊆ ( ℤ𝑁 ) )
13 12 sseld ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( 𝑛 ∈ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) → 𝑛 ∈ ( ℤ𝑁 ) ) )
14 uznn0sub ( 𝑛 ∈ ( ℤ𝑁 ) → ( 𝑛𝑁 ) ∈ ℕ0 )
15 13 14 syl6 ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( 𝑛 ∈ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) → ( 𝑛𝑁 ) ∈ ℕ0 ) )
16 bitsss ( bits ‘ 𝐴 ) ⊆ ℕ0
17 16 a1i ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( bits ‘ 𝐴 ) ⊆ ℕ0 )
18 17 sseld ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) → ( 𝑛𝑁 ) ∈ ℕ0 ) )
19 2cnd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 2 ∈ ℂ )
20 2 a1i ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 2 ∈ ℕ )
21 20 nnne0d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 2 ≠ 0 )
22 simplr ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 𝑁 ∈ ℕ0 )
23 22 nn0zd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 𝑁 ∈ ℤ )
24 simprl ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 𝑛 ∈ ℕ0 )
25 24 nn0zd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 𝑛 ∈ ℤ )
26 19 21 23 25 expsubd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ↑ ( 𝑛𝑁 ) ) = ( ( 2 ↑ 𝑛 ) / ( 2 ↑ 𝑁 ) ) )
27 26 oveq2d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 𝐴 / ( 2 ↑ ( 𝑛𝑁 ) ) ) = ( 𝐴 / ( ( 2 ↑ 𝑛 ) / ( 2 ↑ 𝑁 ) ) ) )
28 simpl ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) → 𝐴 ∈ ℤ )
29 28 zcnd ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) → 𝐴 ∈ ℂ )
30 29 adantr ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → 𝐴 ∈ ℂ )
31 20 24 nnexpcld ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ↑ 𝑛 ) ∈ ℕ )
32 31 nncnd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ↑ 𝑛 ) ∈ ℂ )
33 20 22 nnexpcld ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ↑ 𝑁 ) ∈ ℕ )
34 33 nncnd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ↑ 𝑁 ) ∈ ℂ )
35 31 nnne0d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ↑ 𝑛 ) ≠ 0 )
36 33 nnne0d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ↑ 𝑁 ) ≠ 0 )
37 30 32 34 35 36 divdiv2d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 𝐴 / ( ( 2 ↑ 𝑛 ) / ( 2 ↑ 𝑁 ) ) ) = ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) / ( 2 ↑ 𝑛 ) ) )
38 27 37 eqtr2d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) / ( 2 ↑ 𝑛 ) ) = ( 𝐴 / ( 2 ↑ ( 𝑛𝑁 ) ) ) )
39 38 fveq2d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( ⌊ ‘ ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) / ( 2 ↑ 𝑛 ) ) ) = ( ⌊ ‘ ( 𝐴 / ( 2 ↑ ( 𝑛𝑁 ) ) ) ) )
40 39 breq2d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 2 ∥ ( ⌊ ‘ ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) / ( 2 ↑ 𝑛 ) ) ) ↔ 2 ∥ ( ⌊ ‘ ( 𝐴 / ( 2 ↑ ( 𝑛𝑁 ) ) ) ) ) )
41 40 notbid ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( ¬ 2 ∥ ( ⌊ ‘ ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) / ( 2 ↑ 𝑛 ) ) ) ↔ ¬ 2 ∥ ( ⌊ ‘ ( 𝐴 / ( 2 ↑ ( 𝑛𝑁 ) ) ) ) ) )
42 9 adantrr ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 𝐴 · ( 2 ↑ 𝑁 ) ) ∈ ℤ )
43 bitsval2 ( ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) ∈ ℤ ∧ 𝑛 ∈ ℕ0 ) → ( 𝑛 ∈ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ↔ ¬ 2 ∥ ( ⌊ ‘ ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) / ( 2 ↑ 𝑛 ) ) ) ) )
44 42 24 43 syl2anc ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 𝑛 ∈ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ↔ ¬ 2 ∥ ( ⌊ ‘ ( ( 𝐴 · ( 2 ↑ 𝑁 ) ) / ( 2 ↑ 𝑛 ) ) ) ) )
45 bitsval2 ( ( 𝐴 ∈ ℤ ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) → ( ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) ↔ ¬ 2 ∥ ( ⌊ ‘ ( 𝐴 / ( 2 ↑ ( 𝑛𝑁 ) ) ) ) ) )
46 45 ad2ant2rl ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) ↔ ¬ 2 ∥ ( ⌊ ‘ ( 𝐴 / ( 2 ↑ ( 𝑛𝑁 ) ) ) ) ) )
47 41 44 46 3bitr4d ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ ( 𝑛 ∈ ℕ0 ∧ ( 𝑛𝑁 ) ∈ ℕ0 ) ) → ( 𝑛 ∈ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ↔ ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) ) )
48 47 expr ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( ( 𝑛𝑁 ) ∈ ℕ0 → ( 𝑛 ∈ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ↔ ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) ) ) )
49 15 18 48 pm5.21ndd ( ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) ∧ 𝑛 ∈ ℕ0 ) → ( 𝑛 ∈ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ↔ ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) ) )
50 49 rabbi2dva ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) → ( ℕ0 ∩ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ) = { 𝑛 ∈ ℕ0 ∣ ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) } )
51 bitsss ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ⊆ ℕ0
52 sseqin2 ( ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ⊆ ℕ0 ↔ ( ℕ0 ∩ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ) = ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) )
53 51 52 mpbi ( ℕ0 ∩ ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) ) = ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) )
54 50 53 eqtr3di ( ( 𝐴 ∈ ℤ ∧ 𝑁 ∈ ℕ0 ) → { 𝑛 ∈ ℕ0 ∣ ( 𝑛𝑁 ) ∈ ( bits ‘ 𝐴 ) } = ( bits ‘ ( 𝐴 · ( 2 ↑ 𝑁 ) ) ) )