diff --git a/comsoc/majority.go b/comsoc/majority.go
new file mode 100644
index 0000000000000000000000000000000000000000..4784ae5b0dbed3cf5d8e87cdce3a75c94e677537
--- /dev/null
+++ b/comsoc/majority.go
@@ -0,0 +1,15 @@
+package comsoc
+
+import()
+
+func MajoritySWF(p Profile) (count Count, err error) {
+  for i,voter := range p {
+    count[voter[0]] += 1
+  }                       // 0-votes alternatives are not included
+  return count, nil
+}
+
+func MajoritySCF(p Profile) (bestAlts []Alternative, err error){
+  count,_ := MajoritySWF(p)
+  return maxCount(count), nil
+}
diff --git a/comsoc/utils.go b/comsoc/utils.go
new file mode 100644
index 0000000000000000000000000000000000000000..0910627687411da35e2fffd64141acf7fcedf4f3
--- /dev/null
+++ b/comsoc/utils.go
@@ -0,0 +1,63 @@
+package comsoc
+
+import ("errors")
+
+type Alternative int
+type Profile [][]Alternative
+type Count map[Alternative]int
+
+// renvoie l'indice ou se trouve alt dans prefs
+func rank(alt Alternative, prefs []Alternative) int{
+  for i,v := range prefs {
+    if alt == v {
+      return i
+    }
+  }
+  return -1
+}
+
+// renvoie vrai ssi alt1 est préférée à alt2
+func isPref(alt1, alt2 Alternative, prefs []Alternative) bool {
+  return rank(alt1, prefs) > rank(alt2, prefs)
+}
+
+// renvoie les meilleures alternatives pour un décomtpe donné
+func maxCount(count Count) (bestAlts []Alternative) {
+  max := 0
+  for _,v := range count {
+    switch {
+      case v == max:
+        bestAlts = append(bestAlts, Alternative(v))
+      case v > max:
+        bestAlts = []Alternative{Alternative(v)}
+        // bestAlts = append(bestAlts, v)
+        max = v
+    }
+  }
+  return
+}
+
+// vérifie le profil donné, par ex. qu'ils sont tous complets et que chaque alternative n'apparaît qu'une seule fois par préférences
+func checkProfile(prefs Profile) error
+
+// vérifier que tout le monde a les mêmes alternatives, qu'il n'est pas vide
+
+
+// vérifie le profil donné, par ex. qu'ils sont tous complets et que chaque alternative de alts apparaît exactement une fois par préférences
+func checkProfileAlternative(prefs Profile, alts []Alternative) error {
+  for _,voter := range prefs {
+    if len(voter) != len(alts) {
+      return errors.New("001: ProfileErrors")
+    }
+    check := make(map[Alternative]int)
+    for _,alt := range voter {
+      check[alt] += 1
+      if check[alt] > 1 {
+        return errors.New("001: ProfileErrors")
+      }
+    }
+  }
+  return nil
+}
+
+//jerome.gaigne@hds.utc.fr