# 2020q3 Homework5 (quiz5)
contributed by < [stonelin](https://github.com/StoneLin0708) >
###### tags: `sysprog2020`
## Test 1
```c
#include <stdio.h>
#include <stdlib.h>
double divop(double orig, int slots) {
if (slots == 1 || orig == 0)
return orig;
int od = slots & 1;
double result = divop(orig / 2, od ? (slots + 1) >> 1 : slots >> 1);
if (od)
result += divop(result, slots);
return result;
}
```
A 32 bit floating point number can be represented as
[$sign,exp_0\ ...\ exp_7,fraction_0\ ...\ fraction_{22}$]
Float to integer division can be recursive solved by
**given**
$F\in float_{Nbit}\\
I\in\mathbf{Z}$
$I_{even}=2(I_{even}>>1)\\
I_{odd}=2(I_{odd}>>1)+1$
**Therefor**
**If I is even**
$\dfrac{F}{I_{even}}
=\dfrac{F/2}{I_{even}>>1}$
**If I is odd**
$\dfrac{F}{I_{odd}}
=\dfrac{F}{2(I_{odd}>>1)+1}=
\dfrac{F/2}{(I_{odd}>>1)+1/2}
=\dfrac{F/2}{((I_{odd}+1)>>1)-1/2}\\
=\dfrac{F/2}{((I_{odd}+1)>>1)}\dfrac{((I_{odd}+1)>>1)}{((I_{odd}+1)>>1)-1/2}\\
=>((I_{odd}+1)>>1)=k\\
=\dfrac{F/2}{k}\dfrac{k}{k-1/2}
=\dfrac{F/2}{k}(1+\dfrac{1/2}{k-1/2})\\
=result(1+\dfrac{1/2}{k-1/2})
=result+\dfrac{result}{2k-1}\\
=result+\dfrac{result}{2((I_{odd}+1)>>1)-1}
=result+\dfrac{result}{I_{odd}+1-1}
=result+\dfrac{result}{I_{odd}}
.$
### tail recursion
* It might conditional generate another resursion between result and return, therefor there is no tail recursion exists.
### reduce fpu usage by integer floating point divide 2
* it run a lot slower than just using floating point division (about 150x)
* c++ use less instruction in my case
* resursion use 50 x86 instruction and fpu use 2
<iframe width="1000px" height="800px" src="https://godbolt.org/e#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAZugHZEDKqAhgDbYgCMALOQCse5dq3qhUAUgBMAIRmzyAZ2ydURAg2rZ6mAMLp2AVwC29ENPI7MAGQL1sAOVMAjbKRC8AnOQAO6JWJNegNjM2F/QI0GOwdnEzcPXgA2ZVVsdWCmIlZSIlDTc0sVNWj6bNyiWKdXd08fJRy8gvDuZSaq%2BxqEupSASmV0I1JULgByGQBme1RjHABqSUm9VEbCRiXcSQAGAEEpmbnsReXVokJ0TZ39vft2LvnWIxJ5kgJadnRWInmaPskAOzyPbzUHzUjYIjDejzABUEPsRHcvghRAA%2BmxGks9EZEZNpGiiLDNhAZMk/ktgfsAQARa7XO4PJ4vEg0CC4xj4wm/f5A65g8GQ6FwhGMZGojGsLHLGifb7Eya4UnScn/SZUwF0vbXJEmXyiJHYogAT18OlYJmOABUrnsrb9CAA3aQQK1qjV7XX677YbG23aMhzzDlELk/GhO6TYkNhkkxgk/Ai8qkCjD0RrBvEJ%2BbYAAevhONPmEAIixV822uYBADEABzbBsNtVbRXSSaU/lgghsvO%2BJZ0yY07h9QVQ0gw7YdkFg1HCktl5IV3P1mvVtfVkeAvTFqC9gC0w79yzbm/LlZr9cb23d9Np9M92D1Bt9y39geOsq%2B4cj2M/3xJf7hsmnagrO46vOgbIRgQzoQG8tB9IhU7UlqNy7F6z5Gqa5qWvM1b%2BtW8xOugvgQIRZAEMA5DzIi8xKJ8RBKDe2oPk%2BPpHlseyAURMEkb%2BcpEABAnzBRVE0YwdEMUxix8tOoLdsW9HoIxhb9vM3AyXoW7FqJqmDhWSFyQKo7CqJyECgpEBKSpZLqcBRkCsy6CCkohY8Y6JG0JGECiQMilSWWsh2ScLa4HZ5nGaBQrgRCrkKO5nmxdR1lMRFoKaqoKiAimkUmeBxGkdBsG%2BclAVXIq4XqiBMmoZq95odxrBudwAB00gAKzIWmjS9qQ4k/C4zVRlVLEBhJJisPYED2bsAoooibIyFGHU0JI7V6PQS3kKwAD0LjMbNYLzYwi3SMt7Wretm1neQBUQKw5D7QdmpjAM7AgGM7VjOQ5hjNs33oB9WlyPFShDCMxxTNw31EB9/2IeQADWICTACLWTLW3DcJjKrtV4%2BKo6k71jLw30mCA7XbD9cMAx931KCAVOw39r3kHAsAoBgeoEJwFBUBAXO%2BDzdSzGIwBYw25A0DzSKkAzEAuDTj32LkxofdD5Bc5ajAAPL0Owass7dj5i5wSuEBCmSOtgDNG3mGTPOMGuIqoSv3C4pCqwYODqzDpAEOTYzQwMdCMCwHBcHwgjCKI4hoAoCgiAQLgM5AAwkWUtt7jrkz0%2BkmRaBA1gtOYbTWNU8SJBEARBAwJfV1EwQV7UHhtCUGRlBUzSGIUwjtwX5QdM3PSt%2B0lT123Q9dJXdTDoMwyjDwb0fV91NG4DYzLske7JLw8yi%2BI6mtdsLXbMW%2BDEGQZaTG08wGNzvPX8Od8J3IMM0wjSDYKwOAeNNSP1HRtjbY0gvDbGSO1bghMAQiA%2BqTNe/1yAb3pozcgzN4Zs0QBAFA9tUDPDIJQaguRgBKAAApiFUEwJA6AADuv0NaCx5t8YI5CHDsCobQ36iDGG8zQLHcW3BJY8PcDrZ4HC6FK1wbsUgJC6ZWFzBkbI6w5Gh2YGwM2UchBtH4fHEGcgk4p3gOnXwmcPrZ1zvPCGfdzj2FYZQ6hEig6s2JqvLhtNN61m3rvfe/Cj6n1PvMXACi8EkD6hAC%2BoSn4jmBvIN%2BaCP4DC/j/Oo/9kZQPRg2AEtYvDJGSNk0BXhIGwJJt9NxSC5EMyZgk4p0gyYUypmU5B8SWYDHZggeA2C0BYDwIQUJhDaAMDURHHg/AhCWB0WiSZqA0ilGCNoXQ9dLDl2ni3FGbRIi1xCD3cIlgNllGHlXG%2BMyO5ZA6Is45A8u6dDiKso5jRx7bKKGPPIBy6g3wGGDBe4wDj0FmEYBY2I1iIhakgf0Py/kAuWEC9AIKwVcWEkVF03EKSyUOqCeM3JSxqVhOyLMhJYT/BVKtEaaL94MAzBin4vY3LzlsueOsV5rzlVwG2NKNEez5n7P2Z%2BYEJxsspS5GlWKzzLm2Kudcm4ATbigEXfMB41RaWPJMU8i56WXkbAdAUvK4QfC/ASsksVkJ1VGtcbid1uKiWorRFKkqcryRoP5ZScVBxqQ0lubSPl/bAD0kWa8/wHIzmijCMyJKLIOqsmVcsh5UW5V%2BMJWKblzXeRKo6mychgrMsqna4y2qE3xTuklSSTrNVggyuwLKMbcraqTTBF0KaUohU2Fm6qxqUL1VNcJJqrq2qdRJbRQarrhoejGj8CaU0ZpzX9idZU51LobS2rtfabLjpEFOrOta86bp3Qek9I1tJnEr1KUrDe25PkQ2vrU5p8NEnf1/tQAYyNUbow6pMVG0huAAl3tIXgkx2rFPgeTSmCD3EoKqS0zBHTOboAfu4fpwiPCoAPgIyW0t2Cy3lorI2LgVakENgw6D2siB6wNubE24gzZGwtic62ttEG4Mdr7SgYpiaIPdp7XD3snZ%2BwDr7EOgzw4aNGRYEQYsQCTIxAY1O/8M7BCzjnPOszC7F0ecIZZNyR4N02RPPwNd9krI023fOnczkqcM4pwelRXmj3ud3MIpdnnXO6FXOeZ7F7SGXp9I968Ppbx3nvJDfiT5n3Cb0q%2BUxLB32g0LR%2B4XonvxaTe5Jf8H2AN4NjLGtZpAAi8ACSYOWIH/q84gpplSr2szaZ0%2BjfT%2BbELIRQ9hDj6HfR4cwhgdiGucKVvBtASGJZU3g6I5gjXJHBOkbIsY31cFKPsCo/j6jI5CfGaJ8T0z3ZSeMaYsY5j6bgzc%2B0dY7XxFNY86449PnPF%2BZ8WLQLASgkO0iSFy%2BfVYt33i9e8gSS72pJ4JMHtEDeC8EpiqD92WiZwKKyB5QqD0GvQ85ewDDSzsTbKwjNJktiYWMaXImHCNrZyzmbwIAA%3D"></iframe>
## Test 3
```c
int consecutiveNumbersSum(int N)
{
if (N < 1)
return 0;
int ret = 1;
int x = N;
for (int i = 2; i < x; i++) {
x += 1-i;
if (x % i == 0)
ret++;
}
return ret;
}
```
$N=\Sigma_{i=0}^{h-1}x+i\\
N=(x+x+h-1)h/2\\
N=(2x+h-1)h/2\\
N=xh+(h-1)h/2\\
N-h(h-1)/2=xh$
Therefor the answer is number of integer soultion of $\dfrac{N-h(h-1)/2}{h}\forall{h\in{Z^+}}$
loop through h
$x=N-h(h-1)/2$
$x_{h=0}=N$
$x_{h=1}=N$
$x_{h=2}=N-1$
$x_{h=3}=N-3=N-1-2$
$x_{h=4}=N-6=N-1-2-3$
$x_{h=i}=N-1-2-3\ ...\ -(i-1)$
$x_{h=i}=N-1-2-3\ ...\ +(1-i)$