1 # -*- coding: utf-8 -*-
2 # Author: Julien Moutinho <julm@autogeree.net>
3 # License: GNU GPLv3 (or later, at your choice)
5 from __future__
import unicode_literals
6 from functools
import reduce
12 from com
.sun
.star
.awt
.MessageBoxType
import MESSAGEBOX
, INFOBOX
, WARNINGBOX
, ERRORBOX
, QUERYBOX
13 from com
.sun
.star
.awt
.MessageBoxButtons
import BUTTONS_OK
, BUTTONS_OK_CANCEL
, BUTTONS_YES_NO
, BUTTONS_YES_NO_CANCEL
, BUTTONS_RETRY_CANCEL
, BUTTONS_ABORT_IGNORE_RETRY
14 from com
.sun
.star
.awt
.MessageBoxResults
import OK
, YES
, NO
, CANCEL
15 from com
.sun
.star
.beans
import PropertyValue
16 from com
.sun
.star
.sheet
import CellFlags
18 if 'XSCRIPTCONTEXT' in globals():
20 return (XSCRIPTCONTEXT
.getDocument(), XSCRIPTCONTEXT
)
24 from connect_to_libre_office
import getModel
33 nCk(n,k) retourne le nombre de combinaisons
34 de longueur k d’un ensemble de longueur n.
37 raise ZeroDivisionError
39 k
= n
- k
# more efficient and safe with smaller numbers
41 for j
in range(1,k
+1):
45 def combinOfRank(n
,k
,rank
):
47 combinOfRank(n, k, r) retourne les indices de permutation
48 de la combinaison de k entiers parmi [1..n]
49 au rang lexicographique r dans [0 .. nCk(n,k)-1].
51 Construit chaque choix de la combinaison en prenant le prochain plus grand
52 dont le successeur engendre un nombre de combinaisons
53 qui dépasse le rang restant à atteindre.
55 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, p.26
57 if rank
<0 or nCk(n
,k
)<rank
:
58 raise ZeroDivisionError
64 while True: # uptoRank
65 nbCombins
= nCk(n
-j
, k
-i
)
75 c
.append(j
+rank
) # because when i == k, nbCombins is always 1
81 def rankOfCombin(n
,ns
):
83 rankOfCombin(n, ns) retourne le rang lexicographique dans [0 .. nCk(n, length ns)-1]
84 de la combinaison ns d’entiers parmi [1..n].
86 WARNING: ns doit être triée de manière ascendante.
88 Compte le nombre de combinaisons précédant celle de rang r.
90 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, pp.24-25
92 rankOfCombin(n, combinOfRank(n, k, r)) == r
93 combinOfRank(n, len(ns), rankOfCombin(n, ns)) == ns
95 if not all(1<=x
or x
<=n
for x
in ns
):
96 raise ZeroDivisionError
99 raise ZeroDivisionError
104 for j
in range(x1
+1,x
-1 +1):
105 rank
+= nCk(n
-j
, k
-i
)
112 nbBits(n) retourne le nombre de bits servant à encoder n.
115 raise ZeroDivisionError
122 def equiprobableBits(n
):
124 equiprobableBits(n) retourne le nombre maximal de bits de i
125 équiprobables quand i parcourt [0 .. n-1].
127 Ce nombre est le plus grand 'b' dans [0 .. ] tel que 2**b-1 <= n.
129 map(equiprobableBits, range(0, 17+1)) == [0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4]
132 return (b
if n
== 2**b
-1 else b
-1)
134 def bitsOfInteger(m
, n
):
136 bitsOfInteger(m, n) retourne les m premiers bits de poids faible
137 encodant le nombre n.
139 if not(0<=m
and 0<=n
):
140 raise ZeroDivisionError
149 def randomOfCombin(n
, k
, ns
):
151 randomOfCombin(n, k, ns) retourne des bits équiprobables donnés
152 par la combinaison ns obtenue par tirage équiprobable
153 d’une combinaison de k entiers parmi [1 .. n].
155 WARNING: aucun bit n’est extrait du tirage ns
156 dans le cas où ns a un rang lexicographique encodé par
157 un nombre de bits strictement supérieur à equiprobableBits(nCk(n, k)).
159 if not(0<=n
and 0<=k
and k
<=n
and all(1<=x
and x
<=n
for x
in ns
)):
160 raise ZeroDivisionError
162 rank
= rankOfCombin(n
, ns
)
163 epBits
= equiprobableBits(nCk(n
,k
))
164 return bitsOfInteger(epBits
, rank
) \
165 if nbBits(rank
) <= epBits
else []
167 def randomOfFrenchLoto (n1
,n2
,n3
,n4
,n5
, nc
):
169 randomOfFrenchLoto(n1,n2,n3,n4,n5, numComplementaire) retourne les bits équiprobables donnés
170 par un tirage du Lo to Français : https://www.fdj.fr/jeux/jeux-de-tirage/loto/resultats/.
172 Il peut produire @23@ bits équiprobables :
173 sum(map(equiprobableBits, [nCk(49, 5), nCk(10, 1)]))
175 randomOfFrenchLoto(1,2,3,4,5, 1) == [False] * (20+3)
176 randomOfFrenchLoto(7,27,36,40,46, 8) == [True] * (20+3)
178 combinOfRank(49, 5, 2 ** equiprobableBits(nCk(49,5)) - 1) == [7,27,36,40,46]
179 combinOfRank(49, 5, 2 ** equiprobableBits(nCk(49,5))) == [7,27,36,40,47]
180 randomOfFrenchLoto(7,27,36,40,46, 1) == [True] * 20 + [False] * 3
181 randomOfFrenchLoto(7,27,36,40,47, 1) == [False,False,False]
183 combinOfRank(10, 1, 2 ** equiprobableBits(nCk(10, 1)) - 1) == [8]
184 combinOfRank(10, 1, 2 ** equiprobableBits(nCk(10, 1))) == [9]
185 randomOfFrenchLoto(7,27,36,40,47, 8) == [True,True,True]
186 randomOfFrenchLoto(7,27,36,40,47, 9) == []
189 randomOfCombin(49, 5, [n1
,n2
,n3
,n4
,n5
]) + \
190 randomOfCombin(10, 1, [nc
])
193 def randomOfEuroMillions (n1
,n2
,n3
,n4
,n5
, nc1
,nc2
):
195 https://www.fdj.fr/jeux/jeux-de-tirage/euromillions/resultats
198 randomOfCombin(50, 5, [n1
,n2
,n3
,n4
,n5
]) + \
199 randomOfCombin(11, 2, [nc1
,nc2
])
201 g_exportedScripts
= MakeDraw
,