diff --git a/srp_analysis/src/main.rs b/srp_analysis/src/main.rs
index e7b86406ca7f9419da4aee716677114918d927f3..ee2e2a92f6ee3b0f3d5096c64814b4f400db7e6b 100644
--- a/srp_analysis/src/main.rs
+++ b/srp_analysis/src/main.rs
@@ -76,13 +76,16 @@ fn main() {
     println!("tr: {:?}", tr);
 
     print_analysis(&tasks, &ip, &tr);
+
+    let test = (10.0 as f32/30.0 as f32).ceil();
+    println!("Test {}", test);
 }
 // Prints out vector with [task id, response time, wcet time, blocking time, preemption time]
 fn print_analysis(tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) {
     for t in tasks {
         let b = blocking(t, &tasks, &ip, &tr);
         // let p = preemptions(t, &tasks);
-        let p = recurrence_preemption(t, &tasks, &ip, &tr, true).unwrap();
+        let p = preemptions(t, &tasks, &ip, &tr, true).unwrap();
         let r = response_time(t, &tasks, &ip, &tr, true);
         let c = wcet(t);
         let tasks_analysis = vec![t.id.to_string(), r.to_string(), c.to_string(), b.to_string(), p.to_string()];
@@ -93,8 +96,7 @@ fn print_analysis(tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) {
 fn response_time(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources, exact_solution: bool) -> u32 {
     let b = blocking(task, &tasks, &ip, &tr);
     let c = wcet(task);
-    // let p = preemptions(task, &tasks);
-    let p = recurrence_preemption(task, &tasks, &ip, &tr, exact_solution).unwrap();
+    let p = preemptions(task, &tasks, &ip, &tr, exact_solution).unwrap();
     return b + c + p;
 }
 
@@ -113,43 +115,48 @@ fn load_factor(tasks: &Tasks) -> f32{
     return l_tot;
 }
 
-fn recurrence_preemption(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources, exact_solution: bool) -> Result<u32, String> {
-    if !exact_solution {
-        return Ok(preemptions(task, &tasks, 0, exact_solution));
-    }
-    let sum = wcet(task) + blocking(task, &tasks, &ip, &tr);
-    let mut current_busy_period: u32 = sum + preemptions(task, &tasks, sum, exact_solution);
-    loop {
-        let busy_period: u32 = current_busy_period + preemptions(task, &tasks, current_busy_period, exact_solution);
-        if current_busy_period == busy_period {
-            return Ok(busy_period);
-        }
-        if current_busy_period > task.deadline {
-            return Err("Deadline miss!".to_string());
+fn preemptions_approx(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) -> u32 {
+    let mut p_time = 0;
+    let mut busy_period = task.deadline;
+    for t in tasks {
+        if (t.prio >= task.prio) && (t.id != task.id) {
+            p_time = p_time + wcet(t)*(((busy_period as f32) / (t.inter_arrival as f32)).ceil() as u32);
         }
-        current_busy_period = busy_period;
     }
-}
+    return p_time;
 
+}
 
-fn preemptions(task: &Task, tasks: &Tasks, busy_period: u32, exact_solution: bool) -> u32 {
-    let mut p_time = 0;
+fn preemptions_exact(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources, busy_period: u32) -> Result<u32, String> {
+    let base_case = wcet(task) + blocking(task, &tasks, &ip, &tr);
+    let mut new_busy_period = base_case;
     let mut busy_period = busy_period;
-    if !exact_solution {
-        busy_period = task.deadline;
+    if busy_period == 0 {
+        busy_period = base_case;
     }
     for t in tasks {
-        if t.id == task.id {
-            continue;
-        }
-        if t.prio >= task.prio {
-            let inter_arrival = t.inter_arrival;
-            // println!("bp{} ia{}", busy_period, inter_arrival);
-            p_time = p_time + wcet(t)*(((busy_period as f32) / (inter_arrival as f32)).ceil() as u32);
+        if t.prio >= task.prio && (t.id != task.id) {
+            new_busy_period = new_busy_period + wcet(t)*(((busy_period as f32) / (t.inter_arrival as f32)).ceil() as u32);
         }
     }
-    println!("{}", p_time);
-    return p_time;
+    println!("nb {}, b {}", new_busy_period, busy_period);
+    if new_busy_period.wrapping_sub(base_case) == 0 {
+        return Ok(0);
+    } else if new_busy_period > task.deadline { 
+        return Err("Deadline miss!".to_string());
+    } else if new_busy_period == busy_period {
+        return Ok(new_busy_period - base_case);
+    } else {
+        return preemptions_exact(task, &tasks, ip, tr, new_busy_period);
+    }
+}
+
+fn preemptions(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources, exact: bool) -> Result<u32, String> {
+    if exact {
+        return preemptions_exact(task, &tasks, ip, tr, 0);
+    } else {
+        return Ok(preemptions_approx(task, &tasks, ip, tr));
+    }
 }
 
 fn blocking(task: &Task, tasks: &Tasks, ip: &IdPrio, tr: &TaskResources) -> u32 {