12 from __future__
import print_function
15 VERSION =
'integer --- 2010 March 16'
27 def bin(n, sign=False):
28 """Renvoie un string représentant n en binaire
29 (Si n == 0 alors renvoie '0' ou '+0' si sign=True)
31 alors renvoie la représentation de -n précédée du caractère '-'
33 alors ajoute toujours le signe même si c'est '+'
40 assert isinstance(n, numbers.Integral), n
49 return sign + natural.bin(n)
54 """Renvoie le coefficient binomial (n)
63 assert isinstance(n, numbers.Integral), n
64 assert isinstance(k, numbers.Integral), k
67 raise NotImplementedError
68 return (natural.binom(n, k)
if k >= 0
74 """Renvoie F_k, le kième nombre de Fibonacci
81 assert isinstance(k, numbers.Integral), k
88 """Renvoie (F_(k-1), F_k), les (k-1)ième et kième nombres de Fibonacci
92 Result: couple d'Integral
95 assert isinstance(k, numbers.Integral), k
98 return natural.fibonacci2(k)
100 f2 = natural.fibonacci2(-k + 1)
101 return ((f2[1], -f2[0])
if k&1 == 0
102 else (-f2[1], f2[0]))
107 """Renvoie True si n est un nombre de Fibonacci,
115 assert isinstance(n, numbers.Integral), n
118 return natural.fibonacci_is(n)
120 k = natural.fibonacci_to_index(-n)
121 return k !=
None and k&1 == 0
128 """Si n == F_k alors renvoie k
129 (si n == 1 alors renvoie toujours 1, jamais 2
130 et si n >= 0 alors renvoie toujours le k positif,
139 assert isinstance(n, numbers.Integral), n
142 return natural.fibonacci_to_index(n)
144 k = natural.fibonacci_to_index(-n)
145 return (-k
if (k !=
None)
and (k&1 == 0)
154 la valeurs en k de la fonction f de Fibonacci
155 (c.-à-d. telle que f(n+2) = f(n) + f(n+1))
156 de conditions initiales f(0) == f_0 et f(1) == f_1
165 assert isinstance(f_0, numbers.Integral), f_0
166 assert isinstance(f_1, numbers.Integral), f_1
167 assert isinstance(k, numbers.Integral), k
174 """Renvoie (f(k-1), f(k)),
175 les valeurs en k-1 et k de la fonction f de Fibonacci
176 (c.-à-d. telle que f(n+2) = f(n) + f(n+1))
177 de conditions initiales f(0) == f_0 et f(1) == f_1
183 Result: couple d'Integral
186 assert isinstance(f_0, numbers.Integral), f_0
187 assert isinstance(f_1, numbers.Integral), f_1
188 assert isinstance(k, numbers.Integral), k
191 return (Fk_2*f_0 + Fk_1*f_1,
192 Fk_1*f_0 + (Fk_1 + Fk_2)*f_1)
197 """Renvoie L_k, le kième nombre de Lucas
204 assert isinstance(k, numbers.Integral), k
207 return (Fk_1 << 1) + Fk
212 """Renvoie (L_(k-1), L_k), les (k-1)ième et kième nombres de Lucas
216 Result: couple d'Integral
219 assert isinstance(k, numbers.Integral), k
223 return (Fk + Fk_2, (Fk_1 << 1) + Fk)
228 """Renvoie True si n est un nombre de Lucas,
236 assert isinstance(n, numbers.Integral), n
239 return natural.lucas_is(n)
241 k = natural.lucas_to_index(-n)
242 return k !=
None and k&1 != 0
247 """Si n == F_k alors renvoie k
248 (si n == 1 alors renvoie toujours 1, jamais 2
249 et si n >= 0 alors renvoie toujours le k positif,
258 assert isinstance(n, numbers.Integral), n
261 return natural.lucas_to_index(n)
263 k = natural.lucas_to_index(-n)
264 return (-k
if (k !=
None)
and (k&1 != 0)
270 """Produit des valeurs de f évaluée sur les éléments de s
272 Pre: f: fonction à un paramètre Integral, renvoyant un Integral
273 s: collection d'Integral sur lesquels f est définie
278 assert isinstance(f, types.FunctionType), type(f)
290 """Somme des valeurs de f évaluée sur les éléments de s
292 Pre: f: fonction à un paramètre Integral, renvoyant un Integral
293 s: collection d'Integral sur lesquels f est définie
298 assert isinstance(f, types.FunctionType), type(f)
310 if __name__ ==
'__main__':
318 if not 'profile' in dir():
327 debug.test_begin(VERSION, __debug__)
329 print(
'bin()...', end=
''); sys.stdout.flush()
330 assert bin(-1) ==
'-1',
bin(1)
331 assert bin(0) ==
'0',
bin(0)
332 assert bin(1) ==
'1',
bin(1)
334 assert bin(-1,
False) ==
'-1',
bin(-1,
False)
335 assert bin(0,
False) ==
'0',
bin(0,
False)
336 assert bin(1,
False) ==
'1',
bin(1,
False)
338 assert bin(-1,
True) ==
'-1',
bin(-1,
True)
339 assert bin(0,
True) ==
'+0',
bin(0,
True)
340 assert bin(1,
True) ==
'+1',
bin(1,
True)
341 for i
in range(1, 50):
342 assert bin(2**i - 1) ==
'1'*i, (i,
bin(2**i - 1))
343 assert bin(2**i) ==
'1' +
'0'*i, (i,
bin(2**i))
344 assert bin(2**i + 1) ==
'1' +
'0'*(i - 1) +
'1', (i,
bin(2**i + 1))
345 for n
in range(-16384, 16384):
346 assert int(
bin(n), 2) == n, (n,
bin(n))
347 for n
in range(1, 2**40, 1000000000):
348 assert int(
bin(n), 2) == n, (n,
bin(n))
349 for n
in range(2**32 - 16384, 2**32 + 16384):
350 assert int(
bin(n), 2) == n, (n,
bin(n))
351 print(
'ok'); sys.stdout.flush()
354 print(
'binom()...', end=
''); sys.stdout.flush()
358 for k
in range(1, 10):
359 assert binom(n, n+k) == 0, (n, k,
binom(n, n+k))
361 for k
in range(n + 1):
363 assert s == 2**n, (n, s, 2**n)
364 for n
in range(1, 50):
365 for k
in range(1, n + 1):
367 assert binom(n, k) ==
binom(n - 1, k - 1) * n // k, \
369 assert binom(n, k) ==
binom(n, k - 1) * (n - k + 1) // k, \
370 (n, k,
binom(n, k),
binom(n, k - 1) * (n - k + 1))
371 for n
in range(3, 100):
372 assert binom(n, 2) == ((n - 1)*n)//2, (n,
binom(n, 2), ((n - 1)*n)//2)
373 print(
'ok'); sys.stdout.flush()
376 print(
'fibonacci()...', end=
''); sys.stdout.flush()
379 for k
in range(5000):
381 Fk_1, Fk = Fk, Fk + Fk_1
384 for k
in range(0, -1000, -1):
386 Fk_1, Fk = Fk - Fk_1, Fk_1
387 print(
'ok'); sys.stdout.flush()
390 print(
'fibonacci2()...', end=
''); sys.stdout.flush()
393 for k
in range(5000):
395 Fk_1, Fk = Fk, Fk + Fk_1
398 for k
in range(0, -1000, -1):
400 Fk_1, Fk = Fk - Fk_1, Fk_1
401 print(
'ok'); sys.stdout.flush()
404 print(
'fibonacci_is()...', end=
''); sys.stdout.flush()
415 for k
in range(-1000, 1000):
417 for n
in range(-16384, 16384):
422 if debug.assertspeed >= debug.ASSERT_NORMAL:
423 for n
in range(-(2**45), 2**45, 1000000000):
428 for n
in range(-2**32 - 32768, -2**32 + 32768):
433 for n
in range(2**32 - 32768, 2**32 + 32768):
439 print(debug.assertspeed_str(), end=
'')
440 print(
'ok'); sys.stdout.flush()
443 print(
'fibonacci_to_index()...', end=
''); sys.stdout.flush()
454 for k
in range(-1000, 0):
457 for k
in range(3, 1000):
460 for n
in range(-16384, 16384):
464 if debug.assertspeed >= debug.ASSERT_NORMAL:
465 for n
in range(-(2**45), 2**45, 1000000000):
469 for n
in range(-2**32 - 32768, -2**32 + 32768):
473 for n
in range(2**32 - 32768, 2**32 + 32768):
478 print(debug.assertspeed_str(), end=
'')
479 print(
'ok'); sys.stdout.flush()
482 print(
'fibonacci_gen()...', end=
''); sys.stdout.flush()
483 for k
in range(-100, 1000):
487 for a
in range(-10, 10):
494 print(
'ok'); sys.stdout.flush()
497 print(
'fibonacci2_gen()...', end=
''); sys.stdout.flush()
498 for k
in range(-500, 3000):
503 print(
'ok'); sys.stdout.flush()
506 print(
'lucas()...', end=
''); sys.stdout.flush()
509 for k
in range(5000):
511 Lk_1, Lk = Lk, Lk + Lk_1
514 for k
in range(0, -1000, -1):
516 Lk_1, Lk = Lk - Lk_1, Lk_1
517 print(
'ok'); sys.stdout.flush()
519 print(
'lucas2()...', end=
''); sys.stdout.flush()
526 for k
in range(5000):
528 Lk_1, Lk = Lk, Lk + Lk_1
531 for k
in range(0, -1000, -1):
533 Lk_1, Lk = Lk - Lk_1, Lk_1
534 print(
'ok'); sys.stdout.flush()
537 print(
'lucas_is()...', end=
''); sys.stdout.flush()
549 for k
in range(-1000, 1000):
551 for n
in range(-16384, 16384):
556 if debug.assertspeed >= debug.ASSERT_NORMAL:
557 for n
in range(-(2**45), 2**45, 10000000000):
562 for n
in range(-2**32 - 32768, -2**32 + 32768):
567 for n
in range(2**32 - 32768, 2**32 + 32768):
573 print(debug.assertspeed_str(), end=
'')
574 print(
'ok'); sys.stdout.flush()
577 print(
'lucas_to_index()...', end=
''); sys.stdout.flush()
589 for k
in range(-1000, 0):
591 for k
in range(3, 1000):
593 for n
in range(-16384, 16384):
597 if debug.assertspeed >= debug.ASSERT_NORMAL:
598 for n
in range(-(2**45), 2**45, 1000000000):
602 for n
in range(-2**32 - 32768, -2**32 + 32768):
606 for n
in range(2**32 - 32768, 2**32 + 32768):
611 print(debug.assertspeed_str(), end=
'')
612 print(
'ok'); sys.stdout.flush()
615 print(
'prod()...', end=
''); sys.stdout.flush()
618 assert prod(f, range(1, n + 1)) == math.factorial(n), \
619 (n,
prod(f, range(1, n + 1)), math.factorial(n))
620 assert prod(f, range(-n, n + 1)) == 0, (n,
prod(f, range(-n, n + 1)))
622 assert prod(f, range(1, 2*n, 2)) == natseq.prod(range(1, 2*n, 2)), \
623 (n,
prod(f, range(1, 2*n, 2)), natseq.prod(range(1, 2*n, 2)))
626 assert prod(f, range(1, n + 1)) == math.factorial(n)**2, \
627 (n,
prod(f, range(1, n + 1)), math.factorial(n)**2)
628 assert prod(f, range(-n, n + 1)) == 0, (n,
prod(f, range(-n, n + 1)))
630 assert prod(f, range(1, 2*n, 2)) == natseq.prod(range(1, 2*n, 2))**2, \
631 (n,
prod(f, range(1, 2*n, 2)), natseq.prod(range(1, 2*n, 2))**2)
632 print(
'ok'); sys.stdout.flush()
635 print(
'sum()...', end=
''); sys.stdout.flush()
638 assert sum(f, range(n + 1)) == n*(n + 1)//2, (n,
sum(f, range(n + 1)), n*(n + 1)//2)
639 assert sum(f, range(-n, n + 1)) == 0, (n,
sum(f, range(-n, n + 1)))
641 assert sum(f, range(1, 2*n, 2)) == n*n, (n,
sum(f, range(1, 2*n, 2)), n*n)
644 assert sum(f, range(n + 1)) == n*(n + 1)*(2*n + 1)//6, \
645 (n,
sum(f, range(n + 1)), n*(n + 1)*(2*n + 1)//6)
646 assert sum(f, range(-n, n + 1)) == n*(n + 1)*(2*n + 1)//3, \
647 (n,
sum(f, range(-n, n + 1)), n*(n + 1)*(2*n + 1)//3)
649 assert sum(f, range(1, 2*n, 2)) == n*(4*n*n - 1)//3, \
650 (n,
sum(f, range(1, 2*n, 2)), n*(4*n*n - 1)//3)
651 print(
'ok'); sys.stdout.flush()