]>
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 j
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 Improved to work on k-sequence of permutations instead of only full permutations.
104 for i
in range(1,k
+1):
105 a
//= n
-(i
-1) # optimized a = nAk(n-i, k-i)
106 d
= rank
// a
# greatest multiple of a, lower or equal to r
109 for i
in range(k
-1,-1,-1): # important: from right to left
110 for j
in range(i
+1,k
):
112 p
[j
] += 1 # promote the positions in the good interval
114 def checkSequence(n
,ns
):
116 checkSequence(n,ns) returns the range ns flattened
117 if each element is with 1 and n, without repetition.
120 for row
in ns
: # flatten range given by LO
123 if not(1<=i
and i
<=n
):
125 if i
in p
: # duplicate
130 def rankOfCombin(n
,ns
):
132 rankOfCombin(n, ns) retourne le rang lexicographique dans [0 .. nCk(n, length ns)-1]
133 de la combinaison ns d’entiers parmi [1..n].
135 WARNING: ns doit être triée de manière ascendante.
137 Compte le nombre de combinaisons précédant celle de rang r.
139 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, pp.24-25
141 rankOfCombin(n, combinOfRank(n, k, r)) == r
142 combinOfRank(n, len(ns), rankOfCombin(n, ns)) == ns
144 ns
= checkSequence(n
, ns
)
153 for j
in range(x1
+1,x
-1 +1):
154 rank
+= nCk(n
-j
, k
-i
)
158 def rankOfSequence(n
, ns
):
160 rankOfSequence(n, ns) retourne le rang lexicographique dans [0 .. nAk(n, len(ns))-1]
161 de la combinaison ns d’entiers parmi [1..n].
163 Compte le nombre d’arrangements précédant celui de rang r.
165 DOC: <http://www.site.uottawa.ca/~lucia/courses/5165-09/GenCombObj.pdf>, pp.74
168 ns
= checkSequence(n
, ns
)
174 #print("ns = "+str(ns))
175 #print("rank += %i * nAk(%i,%i)" % (nsi - 1, n - (i+1), k - (i+1)))
176 rank
+= (nsi
- 1) * nAk(n
- (i
+1), k
- (i
+1))
177 for j
in range(i
+1,k
):
183 bitSize(n) retourne le nombre de bits servant à encoder n.
196 def equiprobableBits(n
):
198 equiprobableBits(n) retourne le nombre maximal de bits de i
199 équiprobables quand i parcourt [0 .. n-1].
201 Ce nombre est le plus grand 'b' dans [0 .. ] tel que 2**b-1 <= n.
203 map(equiprobableBits, range(0, 17+1)) == [0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4]
206 return (b
if n
== 2**b
-1 else b
-1)
207 def bitsOfInteger(m
, n
):
209 bitsOfInteger(m, n) retourne les m premiers bits de poids faible
210 encodant le nombre n.
214 if not(0<=m
and 0<=n
):
219 bs
= ("1" if r
else "0") + bs
223 def interleave(cols
):
225 interleave(cols) return a string interleaving the characters
226 of the strings within cols.
232 m
= max(m
, len(cell
))
236 for idx
in range(0, m
):
244 def inBase(base
, digits
):
247 acc
= int(digit
) + (base
* acc
)
249 def randomIntegerOfBits(n
, bs
):
251 randomIntegerOfBits(n, bs) retourne le premier entier i formé par les bits bs
252 qui a le potentiel d’atteindre un entier dans [0 .. n-1],
253 ou recommence en ignorant le premier bit si n <= i.
258 #print("randomIntegerOfBits: "+str((n, bs)))
259 enough
= bitSize(str(n
- 1))
260 #print("randomIntegerOfBits: enough="+str(enough))
273 g_exportedScripts
= ()