Metamath Proof Explorer


Theorem smumullem

Description: Lemma for smumul . (Contributed by Mario Carneiro, 22-Sep-2016)

Ref Expression
Hypotheses smumullem.a โŠข ( ๐œ‘ โ†’ ๐ด โˆˆ โ„ค )
smumullem.b โŠข ( ๐œ‘ โ†’ ๐ต โˆˆ โ„ค )
smumullem.n โŠข ( ๐œ‘ โ†’ ๐‘ โˆˆ โ„•0 )
Assertion smumullem ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ ) ) ยท ๐ต ) ) )

Proof

Step Hyp Ref Expression
1 smumullem.a โŠข ( ๐œ‘ โ†’ ๐ด โˆˆ โ„ค )
2 smumullem.b โŠข ( ๐œ‘ โ†’ ๐ต โˆˆ โ„ค )
3 smumullem.n โŠข ( ๐œ‘ โ†’ ๐‘ โˆˆ โ„•0 )
4 oveq2 โŠข ( ๐‘ฅ = 0 โ†’ ( 0 ..^ ๐‘ฅ ) = ( 0 ..^ 0 ) )
5 fzo0 โŠข ( 0 ..^ 0 ) = โˆ…
6 4 5 eqtrdi โŠข ( ๐‘ฅ = 0 โ†’ ( 0 ..^ ๐‘ฅ ) = โˆ… )
7 6 ineq2d โŠข ( ๐‘ฅ = 0 โ†’ ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) = ( ( bits โ€˜ ๐ด ) โˆฉ โˆ… ) )
8 in0 โŠข ( ( bits โ€˜ ๐ด ) โˆฉ โˆ… ) = โˆ…
9 7 8 eqtrdi โŠข ( ๐‘ฅ = 0 โ†’ ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) = โˆ… )
10 9 oveq1d โŠข ( ๐‘ฅ = 0 โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( โˆ… smul ( bits โ€˜ ๐ต ) ) )
11 bitsss โŠข ( bits โ€˜ ๐ต ) โІ โ„•0
12 smu02 โŠข ( ( bits โ€˜ ๐ต ) โІ โ„•0 โ†’ ( โˆ… smul ( bits โ€˜ ๐ต ) ) = โˆ… )
13 11 12 ax-mp โŠข ( โˆ… smul ( bits โ€˜ ๐ต ) ) = โˆ…
14 10 13 eqtrdi โŠข ( ๐‘ฅ = 0 โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = โˆ… )
15 oveq2 โŠข ( ๐‘ฅ = 0 โ†’ ( 2 โ†‘ ๐‘ฅ ) = ( 2 โ†‘ 0 ) )
16 2cn โŠข 2 โˆˆ โ„‚
17 exp0 โŠข ( 2 โˆˆ โ„‚ โ†’ ( 2 โ†‘ 0 ) = 1 )
18 16 17 ax-mp โŠข ( 2 โ†‘ 0 ) = 1
19 15 18 eqtrdi โŠข ( ๐‘ฅ = 0 โ†’ ( 2 โ†‘ ๐‘ฅ ) = 1 )
20 19 oveq2d โŠข ( ๐‘ฅ = 0 โ†’ ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) = ( ๐ด mod 1 ) )
21 20 fvoveq1d โŠข ( ๐‘ฅ = 0 โ†’ ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod 1 ) ยท ๐ต ) ) )
22 14 21 eqeq12d โŠข ( ๐‘ฅ = 0 โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) โ†” โˆ… = ( bits โ€˜ ( ( ๐ด mod 1 ) ยท ๐ต ) ) ) )
23 22 imbi2d โŠข ( ๐‘ฅ = 0 โ†’ ( ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) ) โ†” ( ๐œ‘ โ†’ โˆ… = ( bits โ€˜ ( ( ๐ด mod 1 ) ยท ๐ต ) ) ) ) )
24 oveq2 โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( 0 ..^ ๐‘ฅ ) = ( 0 ..^ ๐‘˜ ) )
25 24 ineq2d โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) = ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) )
26 25 oveq1d โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) )
27 oveq2 โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( 2 โ†‘ ๐‘ฅ ) = ( 2 โ†‘ ๐‘˜ ) )
28 27 oveq2d โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) = ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) )
29 28 fvoveq1d โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) )
30 26 29 eqeq12d โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) โ†” ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) ) )
31 30 imbi2d โŠข ( ๐‘ฅ = ๐‘˜ โ†’ ( ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) ) โ†” ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) ) ) )
32 oveq2 โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( 0 ..^ ๐‘ฅ ) = ( 0 ..^ ( ๐‘˜ + 1 ) ) )
33 32 ineq2d โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) = ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) )
34 33 oveq1d โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) )
35 oveq2 โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( 2 โ†‘ ๐‘ฅ ) = ( 2 โ†‘ ( ๐‘˜ + 1 ) ) )
36 35 oveq2d โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) = ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) )
37 36 fvoveq1d โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) )
38 34 37 eqeq12d โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) โ†” ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) ) )
39 38 imbi2d โŠข ( ๐‘ฅ = ( ๐‘˜ + 1 ) โ†’ ( ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) ) โ†” ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) ) ) )
40 oveq2 โŠข ( ๐‘ฅ = ๐‘ โ†’ ( 0 ..^ ๐‘ฅ ) = ( 0 ..^ ๐‘ ) )
41 40 ineq2d โŠข ( ๐‘ฅ = ๐‘ โ†’ ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) = ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ ) ) )
42 41 oveq1d โŠข ( ๐‘ฅ = ๐‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ ) ) smul ( bits โ€˜ ๐ต ) ) )
43 oveq2 โŠข ( ๐‘ฅ = ๐‘ โ†’ ( 2 โ†‘ ๐‘ฅ ) = ( 2 โ†‘ ๐‘ ) )
44 43 oveq2d โŠข ( ๐‘ฅ = ๐‘ โ†’ ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) = ( ๐ด mod ( 2 โ†‘ ๐‘ ) ) )
45 44 fvoveq1d โŠข ( ๐‘ฅ = ๐‘ โ†’ ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ ) ) ยท ๐ต ) ) )
46 42 45 eqeq12d โŠข ( ๐‘ฅ = ๐‘ โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) โ†” ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ ) ) ยท ๐ต ) ) ) )
47 46 imbi2d โŠข ( ๐‘ฅ = ๐‘ โ†’ ( ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ฅ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ฅ ) ) ยท ๐ต ) ) ) โ†” ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ ) ) ยท ๐ต ) ) ) ) )
48 zmod10 โŠข ( ๐ด โˆˆ โ„ค โ†’ ( ๐ด mod 1 ) = 0 )
49 1 48 syl โŠข ( ๐œ‘ โ†’ ( ๐ด mod 1 ) = 0 )
50 49 oveq1d โŠข ( ๐œ‘ โ†’ ( ( ๐ด mod 1 ) ยท ๐ต ) = ( 0 ยท ๐ต ) )
51 2 zcnd โŠข ( ๐œ‘ โ†’ ๐ต โˆˆ โ„‚ )
52 51 mul02d โŠข ( ๐œ‘ โ†’ ( 0 ยท ๐ต ) = 0 )
53 50 52 eqtrd โŠข ( ๐œ‘ โ†’ ( ( ๐ด mod 1 ) ยท ๐ต ) = 0 )
54 53 fveq2d โŠข ( ๐œ‘ โ†’ ( bits โ€˜ ( ( ๐ด mod 1 ) ยท ๐ต ) ) = ( bits โ€˜ 0 ) )
55 0bits โŠข ( bits โ€˜ 0 ) = โˆ…
56 54 55 eqtr2di โŠข ( ๐œ‘ โ†’ โˆ… = ( bits โ€˜ ( ( ๐ด mod 1 ) ยท ๐ต ) ) )
57 oveq1 โŠข ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) sadd { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) = ( ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) sadd { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) )
58 bitsss โŠข ( bits โ€˜ ๐ด ) โІ โ„•0
59 58 a1i โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( bits โ€˜ ๐ด ) โІ โ„•0 )
60 11 a1i โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( bits โ€˜ ๐ต ) โІ โ„•0 )
61 simpr โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ๐‘˜ โˆˆ โ„•0 )
62 59 60 61 smup1 โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) = ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) sadd { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) )
63 bitsinv1lem โŠข ( ( ๐ด โˆˆ โ„ค โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) = ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) + if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) )
64 1 63 sylan โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) = ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) + if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) )
65 64 oveq1d โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) = ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) + if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ยท ๐ต ) )
66 1 adantr โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ๐ด โˆˆ โ„ค )
67 2nn โŠข 2 โˆˆ โ„•
68 67 a1i โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ 2 โˆˆ โ„• )
69 68 61 nnexpcld โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( 2 โ†‘ ๐‘˜ ) โˆˆ โ„• )
70 66 69 zmodcld โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) โˆˆ โ„•0 )
71 70 nn0cnd โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) โˆˆ โ„‚ )
72 69 nnnn0d โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( 2 โ†‘ ๐‘˜ ) โˆˆ โ„•0 )
73 0nn0 โŠข 0 โˆˆ โ„•0
74 ifcl โŠข ( ( ( 2 โ†‘ ๐‘˜ ) โˆˆ โ„•0 โˆง 0 โˆˆ โ„•0 ) โ†’ if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โˆˆ โ„•0 )
75 72 73 74 sylancl โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โˆˆ โ„•0 )
76 75 nn0cnd โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โˆˆ โ„‚ )
77 51 adantr โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ๐ต โˆˆ โ„‚ )
78 71 76 77 adddird โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) + if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ยท ๐ต ) = ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) + ( if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ยท ๐ต ) ) )
79 76 77 mulcomd โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ยท ๐ต ) = ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) )
80 79 oveq2d โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) + ( if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ยท ๐ต ) ) = ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) + ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) )
81 65 78 80 3eqtrd โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) = ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) + ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) )
82 81 fveq2d โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) = ( bits โ€˜ ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) + ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) ) )
83 70 nn0zd โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) โˆˆ โ„ค )
84 2 adantr โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ๐ต โˆˆ โ„ค )
85 83 84 zmulcld โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) โˆˆ โ„ค )
86 75 nn0zd โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โˆˆ โ„ค )
87 84 86 zmulcld โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) โˆˆ โ„ค )
88 sadadd โŠข ( ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) โˆˆ โ„ค โˆง ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) โˆˆ โ„ค ) โ†’ ( ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) sadd ( bits โ€˜ ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) ) = ( bits โ€˜ ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) + ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) ) )
89 85 87 88 syl2anc โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) sadd ( bits โ€˜ ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) ) = ( bits โ€˜ ( ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) + ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) ) )
90 oveq2 โŠข ( ( 2 โ†‘ ๐‘˜ ) = if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โ†’ ( ๐ต ยท ( 2 โ†‘ ๐‘˜ ) ) = ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) )
91 90 fveqeq2d โŠข ( ( 2 โ†‘ ๐‘˜ ) = if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โ†’ ( ( bits โ€˜ ( ๐ต ยท ( 2 โ†‘ ๐‘˜ ) ) ) = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } โ†” ( bits โ€˜ ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) )
92 oveq2 โŠข ( 0 = if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โ†’ ( ๐ต ยท 0 ) = ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) )
93 92 fveqeq2d โŠข ( 0 = if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) โ†’ ( ( bits โ€˜ ( ๐ต ยท 0 ) ) = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } โ†” ( bits โ€˜ ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) )
94 bitsshft โŠข ( ( ๐ต โˆˆ โ„ค โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) } = ( bits โ€˜ ( ๐ต ยท ( 2 โ†‘ ๐‘˜ ) ) ) )
95 2 94 sylan โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) } = ( bits โ€˜ ( ๐ต ยท ( 2 โ†‘ ๐‘˜ ) ) ) )
96 ibar โŠข ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โ†’ ( ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) โ†” ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) ) )
97 96 rabbidv โŠข ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โ†’ { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) } = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } )
98 95 97 sylan9req โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ ( bits โ€˜ ( ๐ต ยท ( 2 โ†‘ ๐‘˜ ) ) ) = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } )
99 77 adantr โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ ๐ต โˆˆ โ„‚ )
100 99 mul01d โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ ( ๐ต ยท 0 ) = 0 )
101 100 fveq2d โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ ( bits โ€˜ ( ๐ต ยท 0 ) ) = ( bits โ€˜ 0 ) )
102 simpr โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) )
103 102 intnanrd โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ ยฌ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) )
104 103 ralrimivw โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ โˆ€ ๐‘› โˆˆ โ„•0 ยฌ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) )
105 rabeq0 โŠข ( { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } = โˆ… โ†” โˆ€ ๐‘› โˆˆ โ„•0 ยฌ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) )
106 104 105 sylibr โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } = โˆ… )
107 55 101 106 3eqtr4a โŠข ( ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โˆง ยฌ ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) ) โ†’ ( bits โ€˜ ( ๐ต ยท 0 ) ) = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } )
108 91 93 98 107 ifbothda โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( bits โ€˜ ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) = { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } )
109 108 oveq2d โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) sadd ( bits โ€˜ ( ๐ต ยท if ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) , ( 2 โ†‘ ๐‘˜ ) , 0 ) ) ) ) = ( ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) sadd { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) )
110 82 89 109 3eqtr2d โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) = ( ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) sadd { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) )
111 62 110 eqeq12d โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) โ†” ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) sadd { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) = ( ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) sadd { ๐‘› โˆˆ โ„•0 โˆฃ ( ๐‘˜ โˆˆ ( bits โ€˜ ๐ด ) โˆง ( ๐‘› โˆ’ ๐‘˜ ) โˆˆ ( bits โ€˜ ๐ต ) ) } ) ) )
112 57 111 imbitrrid โŠข ( ( ๐œ‘ โˆง ๐‘˜ โˆˆ โ„•0 ) โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) ) )
113 112 expcom โŠข ( ๐‘˜ โˆˆ โ„•0 โ†’ ( ๐œ‘ โ†’ ( ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) ) ) )
114 113 a2d โŠข ( ๐‘˜ โˆˆ โ„•0 โ†’ ( ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘˜ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘˜ ) ) ยท ๐ต ) ) ) โ†’ ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ( ๐‘˜ + 1 ) ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ( ๐‘˜ + 1 ) ) ) ยท ๐ต ) ) ) ) )
115 23 31 39 47 56 114 nn0ind โŠข ( ๐‘ โˆˆ โ„•0 โ†’ ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ ) ) ยท ๐ต ) ) ) )
116 3 115 mpcom โŠข ( ๐œ‘ โ†’ ( ( ( bits โ€˜ ๐ด ) โˆฉ ( 0 ..^ ๐‘ ) ) smul ( bits โ€˜ ๐ต ) ) = ( bits โ€˜ ( ( ๐ด mod ( 2 โ†‘ ๐‘ ) ) ยท ๐ต ) ) )