]>
Git — Sourcephile - reloto-libreoffice.git/blob - tirages.py
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
7 if 'XSCRIPTCONTEXT' in globals():
9 return (XSCRIPTCONTEXT
.getDocument(), XSCRIPTCONTEXT
.getComponentContext())
13 from connect_to_libre_office
import getModel
19 nAk(n,k) retourne le nombre d’arrangements
20 de longueur k d’un ensemble de longueur n.
25 for i
in range(n
-k
+1, n
+1):
27 #print("nAk%s = %i" % (str((n,k)), r))
30 return str(nAk(int(n
), int(k
)))
33 nCk(n,k) retourne le nombre de combinaisons
34 de longueur k d’un ensemble de longueur n.
39 k
= n
- k
# more efficient and safe with smaller numbers
41 for i
in range(1, k
+1):
43 #print("nCk%s = %i" % (str((n,k)), r))
46 return str(nCk(int(n
), int(k
)))
47 def combinOfRank(n
,k
,rank
):
49 combinOfRank(n, k, r) retourne les indices de permutation
50 de la combinaison de k entiers parmi [1..n]
51 au rang lexicographique r dans [0 .. nCk(n,k)-1].
53 Construit chaque choix de la combinaison en prenant le prochain plus grand
54 dont le successeur engendre un nombre de combinaisons
55 qui dépasse le rang restant à atteindre.
57 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, p.26
59 #print("combinOfRank: "+str((n,k,rank)))
60 if rank
<0 or nCk(n
,k
)<rank
:
67 while True: # uptoRank
68 nbCombins
= nCk(n
-j
, k
-i
)
69 #print("i=%i j=%i rank=%i nCk(%i-%i,%i-%i)=%i" % (i,j,rank, n,j,k,i,nbCombins))
73 #print("rank -= %i" % nbCombins)
81 c
.append(j
+rank
) # because when i == k, nbCombins is always 1
86 def sequenceOfRank(n
, k
, rank
):
88 sequenceOfRank(n, k, r) retourne les indices de permutation
89 de la combinaison de k entiers parmi [1..n]
90 au rang lexicographique r dans [0 .. nAk(n,k)-1].
92 rankOfSequence(n, sequenceOfRank(n, k, r)) == r
93 sequenceOfRank(n, len(ns), rankOfSequence(n, ns)) == ns
95 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, p.75-77
96 Computed from left to right to work on k-sequence of permutations
97 instead of only full permutations.
105 for i
in range(1,k
+1): # first pass from left to right
106 a
//= n
-(i
-1) # optimized a = nAk(n-i, k-i)
107 d
= rank
// a
# greatest multiple of a, lower or equal to r
110 for i
in range(k
-1,-1,-1): # important: from right to left
111 for j
in range(i
+1,k
):
113 p
[j
] += 1 # promote the positions in the good interval
115 def checkSequence(n
,ns
):
117 checkSequence(n,ns) returns the range ns flattened
118 if each element is with 1 and n, without repetition.
121 for row
in ns
: # flatten range given by LO
124 if not(1<=i
and i
<=n
):
126 if i
in p
: # duplicate
131 def rankOfCombin(n
,ns
):
133 rankOfCombin(n, ns) retourne le rang lexicographique dans [0 .. nCk(n, length ns)-1]
134 de la combinaison ns d’entiers parmi [1..n].
136 WARNING: ns doit être triée de manière ascendante.
138 Compte le nombre de combinaisons précédant celle de rang r.
140 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, pp.24-25
142 rankOfCombin(n, combinOfRank(n, k, r)) == r
143 combinOfRank(n, len(ns), rankOfCombin(n, ns)) == ns
145 ns
= checkSequence(n
, ns
)
154 for j
in range(x1
+1,x
-1 +1):
155 rank
+= nCk(n
-j
, k
-i
)
159 def rankOfSequence(n
, ns
):
161 rankOfSequence(n, ns) retourne le rang lexicographique dans [0 .. nAk(n, len(ns))-1]
162 de la combinaison ns d’entiers parmi [1..n].
164 Compte le nombre d’arrangements précédant celui de rang r.
166 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, pp.74
169 ns
= checkSequence(n
, ns
)
174 for i
in range(1,k
+1):
175 a
//= n
-(i
-1) # optimized a = nAk(n-i, k-i)
177 #print("ns = "+str(ns))
178 #print("rank += %i * nAk(%i,%i)" % (nsi - 1, n - (i+1), k - (i+1)))
179 rank
+= (nsi
- 1) * nAk(n
-i
, k
-i
)
186 bitSize(n) retourne le nombre de bits servant à encoder n.
199 def equiprobableBits(n
):
201 equiprobableBits(n) retourne le nombre maximal de bits de i
202 équiprobables quand i parcourt [0 .. n-1].
204 Ce nombre est le plus grand 'b' dans [0 .. ] tel que 2**b-1 <= n.
206 map(equiprobableBits, range(0, 17+1)) == [0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4]
208 return str(bitSize(n
)-1)
209 def equiprobableRank(n
):
211 equiprobableRank(n) retourne le rang maximal imposé
212 par le nombre de résultats possibles n,
213 c’est à dire le nombre précédant la plus grande puissance de 2
214 inférieure ou égale à n.
216 list(map(int,map(equiprobableRank, range(1, 17+1)))) ==
217 [0, 1, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 15, 15]
218 #1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15, 16, 17
220 return str(2**(bitSize(n
)-1)-1)
221 def bitsOfInteger(m
, n
):
223 bitsOfInteger(m, n) retourne les m premiers bits de poids faible
224 encodant le nombre n.
228 if not(0<=m
and 0<=n
):
233 bs
= ("1" if r
else "0") + bs
237 def interleave(cols
):
239 interleave(cols) return a string interleaving the characters
240 of the strings within cols.
246 m
= max(m
, len(cell
))
250 for idx
in range(0, m
):
258 def inBase(base
, digits
):
261 acc
= int(digit
) + (base
* acc
)
263 def randomIntegerOfBits(n
, bs
):
265 randomIntegerOfBits(n, bs) retourne le premier entier i formé par les bits bs
266 qui a le potentiel d’atteindre un entier dans [0 .. n-1],
267 ou recommence en ignorant le premier bit si n <= i.
272 #print("randomIntegerOfBits: "+str((n, bs)))
273 enough
= bitSize(str(n
- 1))
274 #print("randomIntegerOfBits: enough="+str(enough))
287 g_exportedScripts
= ()