---
# System prepended metadata

title: Hw14 - Q2
tags: [109-2, 演算法]

---

# Hw14 - Q2
###### tags: `演算法`, `109-2`


## Question
**Exercises 34.1-5**
Show that if an algorithm makes at most a constant number of calls to polynomial time subroutines and performs an additional amount of work that also takes polynomial time, then it runs in polynomial time. 

Also show that a polynomial number of calls to polynomial-time subroutines may result in an exponential-time algorithm.

## Mein Answer

### 1
**題目**
呼叫 常數 次 polynomial-time 的子程式後，再多做一些 polynomial-time 的事情後，這支程式依舊會是 polynomial-time

**證明**
假設子程式總共有 $y$ 個，其中複雜度最高為 $O(n^k)$
多做的事情複雜度為 $O(n^d)$

則子程式們總複雜度最多為 $O(n^{yk})$
加上多做的事情，複雜度仍為 $O(n^{yk+d})$
因為 $y, k, d$ 為常數，所以這還是 polynomial



### 2
**題目**
呼叫 polynomial 次 polynomial-time 的子程式可能會讓整隻程式變成 exponential-time

**舉個正例：**
演算法魔王錦汶
在段考出 c 道演算法題目
結果錦汶出的每一題都超爆贛難
學生連看都看不懂，更遑論能答對了
不過因為怕被學校關切，錦汶設有補考機制，
補考的題目數依上一次題目數量而定，每一輪是上一輪的平方
假設學生在某次補考中，突然出竅竟然能及格，這次補考一共幾題？

轉換成蘇東code會變這樣
```python=
PROCEDURE JINWEN_HELL():
    c = sqrt(c)
    for round in 1 to n:
        c = ALGORITHM_QUIZ(c)
    
PROCEDURE ALGORITHM_QUIZ(q_count):
    q_count *= q_count
    for q in 1 to q_count:
        DO_ALGORITHM()
    return q_count
    
PROCEDURE DO_ALGORITHM()
    # Fuck up the question
    # Complexity: 1
```

| 第幾輪補考 | 有幾題 |
| ---------- | ------ |
| 1          | c      |
| 2          | c^2    |
| 3          | c^3    |
| 4          | c^4    |
| n          | c^n    |

JINWEN_HELL 考試的輪數為 $n$，是 linear，小於 polynomial
ALGORITHM_QUIZ 的複雜度 $n^2$，也是 polynomial
但是總複雜度會變成 $c^n$，可怕的 exponential

