Download - Algorithm Design Exercises
-
7/31/2019 Algorithm Design Exercises
1/36
Abstract
1 Verification Conditions
Exercise 1 M 9
M mod 9 M 10
10 9
{ 0 M }
q,r := 0 , M+1 ;
{ Invariant: M+1 = 9q+ r }
do 1 0 < r r,q := (r mod 10) + (r 10) , q+ (r 10)
od ;
r := r1
{ 0 r < 9 M = 9q+ r } .
-
7/31/2019 Algorithm Design Exercises
2/36
M = 1367 M = 25679
q r
2
Exercise 2
M m x X y
{ 0 M }
m , x , y := M , X , 0 ;
{ Invariant: 0 m mx+y = MX
Bound function: m }
do m = 0 if even.m m , x := m2 , 2x
2 odd.m m , x , y := (m1)2 , 2x , yx
fi
od
{ y = MX } .
2
2 Saddleback Search
Exercise 3 f g
i j i j f.i f.j. g
m n f.m = g.n
-
7/31/2019 Algorithm Design Exercises
3/36
2
Exercise 4 f g M N
i j
f
i j f[i] f[j] .
g
i,j : 0 i < M 0 j < N : |f[i] g[j]| .
|x| x
m n 0 m < M 0 n < N
f[m] g[n] 0
i,j : m i < M n j < N : |f[i]g[j]|
= (f[m] g[n]) i,j : m i < M n+1 j < N : |f[i] g[j]| .
j = n
g[n] f[m] 0
i,j : 0 i < M 0 j < N : |f[i] g[j]| .
m n d
i,j : 0 i < M 0 j < N : |f[i] g[j]|
= d i,j : m i < M n j < N : |f[i] g[j]| .
M+N MN
M N
d
2
-
7/31/2019 Algorithm Design Exercises
4/36
Exercise 5 M N 0 M 0 N.
k l
0 k N 0 l M Mk = Nl .
M+N
k l Mk Nl kl
2
3 Periodic Functions
Exercise 6 f
i j i < j fi.0 = fj.0 fi
i f f0.0 = 0 fk+1.0 = f.(fk.0) f
p i fi.0 = fi+p.0
f
p:: m :: i,j : i j : fi.0 = fj.0 m i p \ ji .m\n m n n m
k :: n = km
m i j
fm ::
k :: fk.0 = f2k.0 m k p \ k
i j k 2k
f
f
2
-
7/31/2019 Algorithm Design Exercises
5/36
Exercise 7 N 0 1N
d0 , d1 , . . . , dm1dm , dm+1 , . . . , dn1
14
= 0.25000 . . . 25 0
m = 2 n = 3 17
= 0.142857142857 . . . 142857
m = 0 n = 6nm
17
17
= 0.142857142857 . . .
17
1 3 2 6 . . .
7
1N
1N r 1
r,d := (10r) mod N , (10r) N .
r.i r i d.i
d i r.0 = 1 r.(i+1) =(10 r.i) mod N
d.0 d.(i+1) =(10 r.i) N
1N
r
r.N
k : 0 < k : r.N = r.(N+k) .
1N
2
4 Euclids Algorithm
-
7/31/2019 Algorithm Design Exercises
6/36
m n m\n
m n n m k :: n = km
0
m\0 m
Exercise 8 m n m gcd n
p
p \ (m gcd n) p\m p\n .
gcd
0
M N
{ 0 < M 0 < N }
m,n := M,N ;
{ Invariant: 0 < m 0 < n M gcd N = m gcd n }
do m < n n := nm
2 n < m m := mn
od
{ M gcd N = m } .
gcd
gcd
p q
{ 0 < M 0 < N }
m,n,p,q := M,N,M,N ;
-
7/31/2019 Algorithm Design Exercises
7/36
{ Invariant: 0 < m 0 < n M gcd N = m gcd n }
do m < n n,q := nm , p+q
2 n < m m,p := mn , p+q
od
{ M gcd N = m } .
m n p q
mp np mq nq
M N m lcm n
(m lcm n) (m gcd n) = mn .
M N p q
2
5 Quantifiers
Exercise 10 a N i h
k asc.(i,h,k)
asc.(i,h,k) 0 i i+h k j : i j < i+h : a[i] a[j]
asc.(i,h,k) a h ik a len
len.k = h,i : asc.(i,h,k) : h .
len.k k
a
len.0
len.(k+1) = len.k h : asc.(k+1h , h , k+1) : h
2
-
7/31/2019 Algorithm Design Exercises
8/36
6 Miscellaneous
Exercise 11
3 6 2 0 1 4 0 9 4 ,
4 9 0 4 1 0 2 6 3 .
swap
swap(i,j) i j i j
i j
2
Exercise 12
0 0 2 1 0 5 2 ,
0 2 1 0 5 2
0 0 2 0 1 0 5
2
B N
-
7/31/2019 Algorithm Design Exercises
9/36
R
R
N2 N
2
Exercise 13 V N count
k 0 k N x
count(x,k) = j : 0 j < k V[j] = x : 1 .
count xV k
k x e k x
e
{ 0 N }
k , x , e := 0 , a n y , 0 { x }
; { Invariant:
0 k N ke e
count(x,k) e y : y = x : count(y,k) ke
Bound function: Nk }
do k < N body ; k := k+1
od
{ y : y = x : (count(y,N) > N/2) }
body
k , x , e := 0, any , 0
-
7/31/2019 Algorithm Design Exercises
10/36
2
Exercise 14
5 3 8 1 2 7 0 6 4
9
0 3 2 1 0 5 2
4
mex.k
k A 0 i
A[i]
mex.0
a m k s m
k A a
A k a
k A s a
m ks a m
A
0 3 1 1 0 5 2
k = 2 m s 1 a A
k =4 m 2 s 3 a
0 1 1 3 0 5 2
-
7/31/2019 Algorithm Design Exercises
11/36
swap
a swap(i,j)
A[i] A[j] swap(i,i)
a A
(m, k)m m
k
2
Exercise 15 a
N N a
0 1 . . . N1
5 3 8 1 2 7 0 6 4
9 0 1 . . . 8
i j 0 i < j < N a[j] < a[i]
(2, 7) a[2] 8
a[7] 6 a[7] < a[2] 19
a b
a b[i]
i
5 3 6 1 1 3 0 1 0 .
Ni : r : p
i r p
Ni : 0 i < M : a[0] < a[i] = a[0]
-
7/31/2019 Algorithm Design Exercises
12/36
a M
5
k k
k a[0] a[0]
a0
j : 0 j < M : Ni : 0 i < M : a0[i] = j = 1 .
a0a0
k 0 1
{ 0 M j : 0 j < M : a[j] = a0[j] }CountInversions
{ i : 0 i < M : a[i] = Nj : i j < M :a0[j] < a0[i] }
Mk
Mk
Mka0
i : k i < M : Nj : i j < M : a[j] < a[i] = Nj : i j < M :a0[j] < a0[i] ,
k
a0
i : 0 i < k : a[i] = Nj : i j < M : a0[j] < a0[i] .
k 5
5 3 6 1 1 3 0 2 1
5
-
7/31/2019 Algorithm Design Exercises
13/36
5 3 6 1 1
3 0 2 1 ,
0 1 2 3
7 0 6 4 ,
2
Exercise 18
x, y:: ay = bx2 ,
a b
m, n:: 0 m 0 n .
a b
m
n (bm2)/a
n m(an)/b m
1 n 1
2
-
7/31/2019 Algorithm Design Exercises
14/36
1 M r
q
[(1 0 < r) M+1 = 9q + r 0 r1 < 9 M = 9q+ (r1)] .
(1 0 < r) r1 < 9
10 r
0 r1 1 r
1 r M+1 = 9q+ r .
r q1368 0
144 136
18 150
9 151
8 151
M = 1367
r q25680 0
2568 2568
264 2824
30 2850
3 2853
2 2853
M = 25679
r
r
q
-
7/31/2019 Algorithm Design Exercises
15/36
q M Mq
[0 M M
+1 = 90
+M
+1 1 M
+1]
.
[(10 r) 1 r M+1 = 9q+ r 0 r1 < 9 M = 9q+ (r1)] .
K
[10 r 1 r M+1 = 9q+ r r = K (r mod 10) + (r 10) < K] .
[ 10 r 1 r M+1 = 9q+ r
1 (r mod 10) + (r 10)
M+1 = 9(q + (r 10))+ (r mod 10)+ (r 10)
2
2 m
M x X z
[0 M 0 M MX + 0 = MX] .
[(m = 0) 0 m mx+y = MX y = MX] .
[ m = 0 m = K 0 m mx+y = MX even.m
m2 < K
-
7/31/2019 Algorithm Design Exercises
16/36
[ m = 0 m = K 0 m mx+y = MX odd.m
(m1)2 < K
[ m = 0 0 m mx +y = MX even.m
(m2)2x+y = MX
[ m = 0 0 m mx+y = MX odd.m
((m1)2)2x+y x = MX
[0 m mx+y = MX 0 m] ,
[even.m odd.m] .
yx y+x
2
3 m n
i : 0 i < m : j : 0 j : f.i = g.j
j : 0 j < n : i : 0 i : f.i = g.j
g f.m
-
7/31/2019 Algorithm Design Exercises
17/36
(Mm) + (Nn) M N
f.M = g.N
2
4
i,j : m i < M n j < N : |f[i]g[j]|
= { j = n }
i : m i < M : |f[i] g[n]| i,j : m i < M n+1 j < N : |f[i]g[j]|
= { i : m i < M : |f[i] g[n]|
= { i = m }
|f[m] g[n]| i : m+1 i < M : |f[i] g[n]|
= { f[m] g[n] 0
i m+1 i < M f[m] f[i]
f[m] g[n] f[i] g[n] }
f[m] g[n] }
(f[m] g[n]) i,j : m i < M n+1 j < N : |f[i] g[j]| .
i,j : m i < M n j < N : |f[i]g[j]|
= (g[n] f[m]) i,j : m+1 i < M n j < N : |f[i] g[j]| .
m n
m n
d
|f[0] g[0]|
M N
{ i : 0 i < M : j : i j < M : f[i] f[j]
i : 0 i < N : j : i j < N : g[i] g[j] }
m,n,d := 0,0,|f[0] g[0]| ;{ Invariant:
d i,j : m i < M n j < N : |f[i] g[j]|
= i,j : 0 i < M 0 j < N : |f[i] g[j]| }
-
7/31/2019 Algorithm Design Exercises
18/36
do m = M n = N if f.m
-
7/31/2019 Algorithm Design Exercises
19/36
2 Nl < Mk l := l+1
2 Mk = Nl k , l , count := k+1 , l+1 , count+1
fi
od ;
count := count+1
{ count = S.(0,0) = i,j : 0 i N 0 j M Mi = Nj : 1 } .
(Ml) + (Nk) 0
0 k N 0 l M 1 2
M k N l
d d = Mk Nl
{ 0 M 0 N }k , l , count , d := 0 , 0 , 0 , 0 ;
{ Invariant: }
do k = N l = M if d < 0 k , d := k+1 , d+M
2 d > 0 l , d := l+1 , dN
2 d = 0 k , l , count , d := k+1 , l+1 , count+1 , d+MN
fi
od ;count := count+1
{ count = S.(0,0) = i,j : 0 i N 0 j M Mi = Nj : 1 } .
2
6 fk.0 k
f2k.0
{ f }
f1,f2,k := 0,0,0 ;{ Invariant: f1 = fk.0 f2 = f2k.0 0 k }
do f1 = f2 f1,f2,k := f.f1,f.(f.f2) , k+1
od ;
-
7/31/2019 Algorithm Design Exercises
20/36
p := k
{ p f }
2
7 m n
j :: d.(m+j+1) = d.(m+n+j+1) j :: r.(m+j) = r.(m+n+j) .
d.(i+1) = d.(i+j+1)
= { d }
(10 r.i) N = (10 r.(i+j)) N
= { 0 < N }
(10 r.i) N N = (10 r.(i+
j)) N N= { p = p N N + p mod N }
10 r.i (10 r.i) mod N = 10 r.(i+j) (10 r.(i+j)) mod N
= { }
10(r.i r.(i+j) ) = (10 r.i) mod N (10 r.(i+j)) mod N
= { }
10(r.i r.(i+j)) = r.(i+1) r.(i+j+1) .
j :: d.(m+j+1) = d.(m+n+j+1)
= { i,j := m+j , n }
j :: 10(r.(m+j) r.(m+n+j)) = r.(m+j+1) r.(m+n+j+1)
= {
c
j :: 10 c.j = c.(j+1)
j :: 10j
c.0 = c.j
.
c.j r.(m+j) r.(m+n+j) }j :: 10j(r.m r.(m+n)) = r.(m+j+1) r.(m+n+j+1)
= { r.(m+j+1) r.(m+n+j+1)
-
7/31/2019 Algorithm Design Exercises
21/36
N N
10j(r.m r.(m+n))
r.m r.(m+n) = 0 }
j :: 0 = r.(m+j) r.(m+n+j)
= { }
j :: r.(m+j) = r.(m+n+j) .
N+1 r.0 r.1 . . . r.N 0
N
j,k : 0 j < k N : r.j = r.k .
r
j,k : 0 j < k N : i : 0 i : r.(i+j) =r.(i+k) .
i i Nj
j,k : 0 j < k N : r.N = r.(Nj+k) .
m := kj
m : 0 < m : r.N = r.(N+m) .
N k
r.N = r.(N+k)
i,r := 0,1 ; do i = N i,r := i+1 , (10r) mod N od
{ r = r.N } ;
k , r := 1 , r mod N ;
do r = r k,r := k+1 , (10r ) mod N od
r = r.i
r = r.N r = r.(N+k) j : 0 < j < k : r.N = r.(N+j) .
r = r k
r 1N
2
-
7/31/2019 Algorithm Design Exercises
22/36
8 m+n
[m < n 0 < m 0 < n M gcd N = m gcd n
0 < m 0 < nm M gcd N = m gcd (nm)
[n < m 0 < m 0 < n M gcd N = m gcd n
0 < mn 0 < n M gcd N = (mn) gcd n
[0 < m 0 < n M gcd N = m gcd n (m < n n < m)
M gcd N = m
[m gcd n = m gcd (nm)]
[m gcd m = m] .
(m < n n < m) m = n
p
p \ (m gcd (nm))
= { }
p\m p\(nm)
= { }
k :: m = kp k :: nm = kp
= { }
k :: m = kp j :: nm = jp
= { }
k :: m = kp j :: n kp = jp= { j := jk }
k :: m = kp j :: n = jp
= { }
-
7/31/2019 Algorithm Design Exercises
23/36
k :: m = kp k :: n = kp
= { }
p\m p\n
= { }
p \ (m gcd n) .
m gcd (nm) p m gcd n p
[m gcd n = m gcd (nm)] .
p
p \ (m gcd m)
= { }
p\m p\m= { }
p\m .
m gcd m p m p
[m gcd m = m] .
c , k :: k \ (cM) k \ (cN) k \ (c m) k \ (cn)
gcd
k :: k \ M k \ N k \ (M gcd N)
m n M gcd N
c , k :: k \ (cM) k \ (cN) k \ (c (M gcd N))
cM gcd cN x
k :: k \ (cM) k \ (cN) k \ x
c (M gcd N) cM gcd cN
k \ (c m) k \ (cn) k \ (c (mn)) k \ (cn)
k c m n n < m
-
7/31/2019 Algorithm Design Exercises
24/36
mq +np = 2MN .
a b c d
amp +bmq+ cnp + dnq
amp + bmq+ cnp + dnq
= a(mn)(p+q) +b(mn)q+ cn(p+q) +dnq
a d 0 b c 1
amp + bmq+ cnp + dnq
= amp +bm(p+q) + c(nm)p +dn(p+q)
a d 0 b c 1m = n = M gcd N
true
= { m = n = M gcd N }
(M gcd N) (p+q) = 2MN
= { (m lcm n) (m gcd n) = mn }
(M gcd N) (p+q) = 2 (M lcm N) (M gcd N)
{ }
(p+q)2 = M lcm N .
p q M
N
2
10
len.0
= { len } h,i : asc.(i,h,0) : h
= { asc }
h,i : 0 i i+h 0 j : i j < i+h : a[i] a[j] : h
-
7/31/2019 Algorithm Design Exercises
25/36
= { 0 i i+h 0 0 = i = h
}
h,i : 0 = i = h j : 0 j < 0 : a[i] a[j] : h
= { }
h,i : 0 = i = h: h
= { }
0 .
len.(k+1)
= { len }
h,i : asc.(i , h , k+1) : h
= { asc }
h,i : 0 i i+h k+1 j : i j < i+h : a[i] a[j] : h
= { i+h= k+1
len }
len.k h,i : 0 i i+h= k+1 j : i j < i+h : a[i] a[j] : h
= { }
len.k h : 0 k+1h k+1 j : k+1h j < k+1 : a[i] a[j] : h
= { asc }
len.k h : asc.(k+1h , h , k+1) : h .
2
11 j k
N
{ 0 N i : 0 i < N : a[i] = a0[i] }
j,k := 0 , N1{ Invariant:
0 j < N 0 k < N j = N1k
i : 0 i < j k i < N : a[i] = a0[N1i]
-
7/31/2019 Algorithm Design Exercises
26/36
i : j i k : a[i] = a0[i]
Bound function: kj }
; do j < k swap(j,k) ; j,k := j+1 , k1
od
{ i : 0 i < N : a[i] = a0[N1i] }
j k
j k j k
2
12
R (c, n) c
n c
n
{ 0 < M 0 < N }
c,n,k := 0,AnyValue,0 ;
{ Invariant: c n B[0..k) }
do k < N if c = 0 n = B[k] c := c+1
2 c = 0 n = B[k] c := c1
2 c = 0 c,n := 1,B[k]
fi ;
k := k+1
od
{ c n B[0..N) }
N2
N2
c
n c
-
7/31/2019 Algorithm Design Exercises
27/36
n
2
13 k
0 k N V[k] = x count(x,k) 1
e := e+1 V[k] = xcount(x,k) ke < e ke e
V[k] = x ke = e ke e
count(x,k) ke count(x,k) e ke e
x V[k]
if V[k] = x e := e+1
2 V[k] = x ke < e skip
2 V[k] = x ke = e x , e := V[k] , e+1
fi
inv
count N V k e z
[0 N 0 0 N 00 0 y : y = any : count(y,0) 00] .
[(k < N) inv y :y = x : (count(y,k) > k/2)] .
[ k < N inv V[k] = x
0 k+1 N (k+1)(e+1) e+1
y : y = x : count(y,k) (k+1)(e+1)
-
7/31/2019 Algorithm Design Exercises
28/36
[ k < N inv V[k] = x ke < e
0 k+1 N (k+1)e e
y : y = x : count(y,k) (k+1)e
[ k < N inv V[k] = x ke = e
0 k+1 N (k+1)(e+1) e+1
y : y = V[k] : count(y,k) (k+1)(e+1)
k
[Nk = K N(k+1) < K] .
count
[ 0 N
0 N y : y = any : j : 0 j < 0 V[j] =y : 1 0
y :y = any : j : 0 j < 0 V[j] =y : 1 0
= { 0 j < 0 false }
y :y = any : 0 0
= { 0 0 true true }true
[0 N 0 N true]
true
(k < N) inv { }
k = N ke e y : y = x : count(y,k) ke
= { }
-
7/31/2019 Algorithm Design Exercises
29/36
k = N N/2 e y : y = x : count(y,N) Ne
{ }
y : y = x : count(y,N) NN/2
= { N = N/2+N/2 }
y : y = x : count(y,N) N/2
= { > }
y : y = x : (count(y,N) > N/2)
2
14
mex.k = n : i : 0 i < k : n = A[i] : n
mex.0
= { }
n : i : 0 i < 0 : n = A[i] : n
= { }
n : false : n
= { n }
0 .
{ A }
m,k,done := 0,0,false ;
{ Invariant: 0 k N m = mex.k (done m = mex.N)
Bound function: k }
do done k < N if m = A[k] m := m+1
2 m < A[k] done := true2 m > A[k] skip
fi ;
k := k+1
-
7/31/2019 Algorithm Design Exercises
30/36
od
{ m = mex.N }
{ 0 N }
m,s,k := 0,0,0 ;
{ Invariant:
0 m s k N m = mex.k
i : 0 i < s : a[i] < m
i : s i < k : a[i] > m
Bound function: (m, k) }
do k < N if m = A[k] swap(s,k) ; m,s,k := m+1 , s+1 , s+1
2 m < A[k] k := k+1
2 m > A[k] swap(s,k) ; s,k := s+1 , k+1
fi
od
{ m = mex.N }
2
15
a[m..n) a
m n count.i count0.i
a[i] a0[i]
count.i = Nj : i j < M : a[i] < a[j] ,
count0.i = Nj : i j < M :a0[i] < a0[j] ,
permutation.a[k..M) ,
i : k i < M : count.i = count0.i ,
i : 0 i < k : a[i] = count0.i .
-
7/31/2019 Algorithm Design Exercises
31/36
k := 0
k = M
a[k] = count.k .
k 1
k
i 0 i k
k < i < M a[i] < a[k] k < i < M a[i] > a[k] k < i < M
a[i] = a[k] a[i] 1 i
k < i < M a[i] > a[k]
2 1
2 1
{ 0 M j : 0 j < M : a[j] = a0[j]
permutation.a[0..M) }
k := 0
{ Invariant:
0 k M
Bound function: Mk }
-
7/31/2019 Algorithm Design Exercises
32/36
; do k = M k := k+1
; innerloop
od
{ j : 0 j < M : a[j] = count0.j }
innerloop
j := k+1
; do j < M if a[j] < a[k] skip
2 a[j] > a[k] a[j] := a[j]1
fi
; j := j+1
od
2
18 g
g.m =
bm2
a
1
2
.
g.m m 0 1 2
g.(m+1) > g.m +1 .
{ true }
m,n := 0,0 ;
{ Invariant: n = g.m }
do g.(m+1) g.m +1 plot.(m,n) ;
m,n := m+1 , g .(m+1)od .
g g.(m+1) g.m
-
7/31/2019 Algorithm Design Exercises
33/36
g.(m+1) g.m
= { n = g.m
g.m n
g }b(
m+1)
2
a 1
2
n
= { }b(m+1)2
a
1
2 n
= { }
0 an b(m+1)2 + a
2
= { h = an b(m+1)2 + a
2 }
0 h .
g.(m+1) g.m +1
g.(m+1) g.m + 1
= { }b(m+1)2
a
1
2 n+1
= { }
0 an b(m+1)2 + 3a
2
= { h = an b(m+1)2 + a2
}
0 h+a .
h
{ true }
m , n , h := 0 , 0 , a
2 b ;
{ Invariant:
n = g.m
h = an b(m+1)2 + a
2
(a h < 0 g.(m+1) g.m = 1) }
do 0 h+a plot.(m,n) ;
-
7/31/2019 Algorithm Design Exercises
34/36
if 0 h { g.(m+1) = g.m }
skip
2 (0 h) { g.(m+1) = g.m +1 }
n,h := n+1 , p
fi ;
m,h := m+1 , q
od .
p q p q
h = an b(m+1)2 + a
2 .
k
{ h = k b(m+1)2 }
m,h := m+1 , h b(2m+ 3)
{ h = k b(m+1)2 } .
k
{ h = an + k }
n,h := n+1 , h+a
{ h = an + k } .
p q
{ true }
m , n , h := 0 , 0 , a
2 b ;
{ Invariant:
n = g.m
h = an b(m+1)2 + a
2
((2a) h < 0 g.(m+1) g.m = 1) }do 0 h+a plot.(m,n) ;
if 0 h { g.(m+1) = g.m }
skip
-
7/31/2019 Algorithm Design Exercises
35/36
2 (0 h) { g.(m+1) = g.m +1 }
n,h := n+1 , h+a
fi ;
m,h := m+1 , h b(2m +3)
od .
n
m
f
f.n =
an
b
1
2
.
{ n = g.m }
m := f.n ;
{ Invariant: m = f.n }
do true plot.(m,n) ;
m,n := f.(n+1) , n+1
od .
f.(n+1) f.n
f.(n+1) f.n
= { m = f.n
m
g }a(n+1)
b
1
2
m
= { }a(n+1)
b
1
2 m
= { }a(n+1) b (m2+ m+
1
4)
= { }
0 b (m2+ m) a(n+1) b
4 .
-
7/31/2019 Algorithm Design Exercises
36/36
h
m
{ n = g.m }
m := f.n ;
h := b (m2+ m) a(n+1) b
4 ;
{ Invariant:
m = f.n
h = b (m2+ m) a(n+1) b
4
(f.(n+1) f.n 0 h) }
do true plot.(m,n) ;
if 0 h { f.(n+1) = f.n }
skip
2 (0 h) { f.(n+1) = f.n +1 }
m,h := m+1 , h+ 2b(m+1)
fi ;
n,h := n+1 , h a
od .
bm b m
h
2