diff --git a/practical_work/forces/Makefile b/practical_work/forces/Makefile
index 6ef1cce54f914858ed0409dbeebde34136475830..111de518709e4351da54727b8782a42081be05b0 100644
--- a/practical_work/forces/Makefile
+++ b/practical_work/forces/Makefile
@@ -1,6 +1,6 @@
 CC=gcc
-OPTS=-g -O3 -Wall -Wextra
-LINK=-lm
+OPTS=-g -O3 -Wall -Wextra -fsanitize=address -fsanitize=leak 
+LINK=-lm -lasan
 
 main: main.o particle.o ../vec2/vec2.o
 	$(CC) $(OPTS) -o $@ $^ $(LINK)
diff --git a/practical_work/forces/main.c b/practical_work/forces/main.c
index 61a4717bd4935a156f9df0b93039ac94e0516ba4..b29a965d267d0eb310a9c00211b7c8d06f0476ca 100644
--- a/practical_work/forces/main.c
+++ b/practical_work/forces/main.c
@@ -1,3 +1,5 @@
+#include <stdlib.h>
+#include <stdio.h>
 #include "../vec2/vec2.h"
 #include "particle.h"
 
@@ -12,4 +14,11 @@ int main() {
     vec2 force = particle_compute_grav_force(parts[0], p);
     vec2_print(force);
 
+    vec2 *forces = particle_compute_grav_resultant_forces(parts, number);
+    for (int ip = 0; ip < number; ++ip) {
+        printf("force %d: \n", ip);
+        vec2_print(forces[ip]);
+    }
+
+    free(parts);
 }
\ No newline at end of file
diff --git a/practical_work/forces/particle.c b/practical_work/forces/particle.c
index ed3d1a5be3a9749a3be92646fe6f5f3c662b15e7..e7a5c5e789d24142dbe96ac3725d53a1af9868f7 100644
--- a/practical_work/forces/particle.c
+++ b/practical_work/forces/particle.c
@@ -30,7 +30,7 @@ particle particle_random_create(vec2 min_r, vec2 max_r, double min_m, double max
 }
 
 particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, double max_m, int number) {
-    particle *p = malloc(number * sizeof(particle_create));
+    particle *p = malloc(number * sizeof(particle));
 
     srand(time(NULL));
 
@@ -50,6 +50,20 @@ vec2 particle_compute_grav_force(particle lhs, particle rhs) {
     return vec2_mul(factor, rij);
 }
 
+vec2 *particle_compute_grav_resultant_forces(particle *parts, int number) {
+    vec2 *forces = malloc(number * sizeof(vec2));
+    for (int ip = 0; ip < number; ++ip) {
+        forces[ip] = vec2_create_zero();
+    }
+    for (int ip = 0; ip < number; ++ip) {
+        for (int iq = ip + 1; iq < number; ++iq) {
+            forces[ip] = vec2_add(forces[ip], particle_compute_grav_force(parts[ip], parts[iq]));
+            forces[iq] = vec2_add(forces[iq], particle_compute_grav_force(parts[iq], parts[ip]));
+        }
+    }
+    return forces;
+}
+
 void particle_print(particle p) {
     printf("m = %g\n", p.m);
     vec2_print(p.r);
diff --git a/practical_work/forces/particle.h b/practical_work/forces/particle.h
index bee52616efb487d0bc2cc417efbe736bbf8d4331..3e4b66b42f1df3dc85649b1778669492d0c979b9 100644
--- a/practical_work/forces/particle.h
+++ b/practical_work/forces/particle.h
@@ -16,6 +16,8 @@ particle *particle_random_create_list(vec2 min_r, vec2 max_r, double min_m, doub
 
 vec2 particle_compute_grav_force(particle lhs, particle rhs);
 
+vec2 *particle_compute_grav_resultant_forces(particle *parts, int number);
+
 void particle_print(particle p);
 
 void particle_print_list(particle *p, int number);
diff --git a/practical_work/vec2/vec2.c b/practical_work/vec2/vec2.c
index 834ae1340682c06d2d32c006e22a3efc71e45de1..abae499ad116027aa0d0006b6a15c49da0970c59 100644
--- a/practical_work/vec2/vec2.c
+++ b/practical_work/vec2/vec2.c
@@ -7,6 +7,10 @@ vec2 vec2_create(double x_, double y_) {
     return v;
 }
 
+vec2 vec2_create_zero() {
+    return vec2_create(0.0, 0.0);
+}
+
 vec2 vec2_add(vec2 lhs, vec2 rhs) {
     return vec2_create(
         lhs.x + rhs.x,
diff --git a/practical_work/vec2/vec2.h b/practical_work/vec2/vec2.h
index 402824d12890dd2e0946fb591680c72eeb717e55..3d4dc150686d06f701a09467af5216057b8e0661 100644
--- a/practical_work/vec2/vec2.h
+++ b/practical_work/vec2/vec2.h
@@ -9,6 +9,8 @@ typedef struct _vec2 {
 
 vec2 vec2_create(double x_, double y_);
 
+vec2 vec2_create_zero();
+
 vec2 vec2_add(vec2 lhs, vec2 rhs);
 
 vec2 vec2_sub(vec2 lhs, vec2 rhs);