14 from __future__
import print_function
17 VERSION =
'nbsystem --- 2010 March 16'
29 """Renvoie le chiffre correspondant au caractère c
31 Pre: c: caractère alphanumérique
36 assert isinstance(c, str), type(c)
37 assert c.isalnum(), (type(c), c)
39 return (ord(c) - ord(
'0')
if c.isdigit()
40 else ord(c.upper()) + 10 - ord(
'A'))
45 """Renvoie le naturel représentant n (en binaire)
46 dans le système de numération de Fibonacci
48 C.-à-d. si n = Sum(b_i * F_(i+2)) alors renvoie Sum(b_i * 2**i)
50 où b_i = 0 ou 1 tel que si b_i = 1 alors b_(i+1) = 0
51 F_(i+2) = (i+2)ème nombre de Fibonacci
55 Result: naturel "normalisé"
56 suivant le système de numération de Fibonacci
64 (fi_1, fi_2) = natural.fibonacci2(i + 2)
67 (fi_1, fi_2) = (fi_2, fi_2 + fi_1)
74 (fi_1, fi_2) = (fi_2 - fi_1, fi_1)
76 f = natural.bitset1(f, i)
79 (fi_1, fi_2) = (fi_2 - fi_1, fi_1)
87 """Renvoie le naturel égal
88 à la valeur de f exprimée dans le système de numération de Fibonacci
90 C.-à-d. si f = Sum(b_i * 2**i) alors renvoie Sum(b_i * F_(i+2))
93 F_(i+2) = (i+2)ème nombre de Fibonacci
95 Pre: f: naturel ("normalisé" ou non)
104 from_i = natural.scan1(f)
105 (fi_1, fi_2) = natural.fibonacci2(from_i + 2)
106 for i
in range(from_i, natural.rscan1(f) + 1):
107 if natural.bit(f, i):
109 (fi_1, fi_2) = (fi_2, fi_2 + fi_1)
118 """Renvoie n "normalisé" suivant le système de numération de Fibonacci,
119 c.-à-d. renvoie le naturel représentant le même nombre que f
120 dans le système de numération de Fibonacci
121 mais ne contenant pas deux chiffres '1' consécutifs
125 Result: naturel "normalisé"
126 suivant le système de numération de Fibonacci
132 k = natural.rscan1(f) - 1
135 mask1100 = mask11 << 2
139 while f&mask11 != mask11:
148 if f&mask1100 == mask1100:
162 """Renvoie le ième chiffre de n en base b
177 return int(natural.bit(n, i))
178 elif natural.nbbits1(b) == 1:
180 return (n >> (k*i)) % b
182 while (i > 0)
and (n > 0):
190 """Renvoie le caractère correspondant au chiffre n
191 Si caps alors utlise les lettres majuscules pour représenter les chiffers > 9
192 sinon utlise les lettres minuscules
194 Pre: n: naturel <= 36
197 Result: caractère alphanumérique
203 return (chr(n + ord(
'0'))
if n < 10
204 else chr(n + (ord(
'A')
if caps
205 else ord(
'a')) - 10))
210 """Renvoie n avec son ième chiffre en base b changé en c
219 O(n, i, c, b) = ..."""
228 return natural.bitset(n, i, c)
233 return q*(p*b) + (c*p + r)
238 """Renvoie le naturel correspondant à la liste s de chiffres en base b
239 (Si n == [] alors renvoie 0)
241 Pre: s: liste de naturels
252 for i
in range(len(s)):
255 n = natural.bitset(n, i, s[i])
268 """Renvoie le naturel représenté par s en base b
269 (Si n == 0 alors renvoie '0')
271 Pre: s: string ne contenant que des chiffres < b
272 b: 2 <= naturel <= 36
277 assert isinstance(s, str), type(s)
279 assert 2 <= b <= 36, b
283 for i
in range(len(s)):
284 assert s[-i-1].isalnum(), (type(s[-i-1]), s[-i-1])
286 n = natural.bitset(n, i, s[-i-1] !=
'0')
289 for i
in range(len(s)):
290 assert s[-i-1].isalnum(), (type(s[-i-1]), s[-i-1])
299 """Renvoie la somme des chiffres de n représenté en base b
312 return natural.nbbits1(n)
313 elif natural.nbbits1(b) == 1:
315 m_k = natural.mersenne(k)
331 """Renvoie la somme des chiffres alterné de n représenté en base b
332 (1er chiffre en positif, 2e en négatif, 3e en positif ...)
355 """Renvoie la liste des chiffres de n écrit en base b
356 (Si n == 0 alors renvoie [])
361 Result: liste de naturels (dont le dernier élémént est non nul)
382 """Renvoie un string représentant n en base b
383 (Si n == 0 alors renvoie '0')
384 Si caps alors utlise les lettres majuscules pour représenter les chiffers > 9
385 sinon utlise les lettres minuscules
388 b: 2 <= naturel <= 36
391 Result: string (dont le premier caractère est différent de '0')
396 assert 2 <= b <= 36, b
400 return natural.bin(n)
415 if __name__ ==
'__main__':
421 if not 'profile' in dir():
431 debug.test_begin(VERSION, __debug__)
433 print(
'chr_to_fig()...', end=
''); sys.stdout.flush()
442 print(
'ok'); sys.stdout.flush()
445 print(
'fibonacci()...', end=
''); sys.stdout.flush()
452 for n
in range(10000):
454 assert bit32.bin(f).find(
'11') == -1, (n, f, bit32.bin(f))
456 for i
in range(bit32.nbbits(f)):
458 s += nat32.fibonacci(i + 2)
459 assert s == n, (n, s, f, bit32.bin(f))
461 print(
'ok'); sys.stdout.flush()
464 print(
'fibonacci_to_n()...', end=
''); sys.stdout.flush()
474 assert fibonacci_to_n((1<<k) + 1) == natural.fibonacci(k + 2) + 1, \
476 assert fibonacci_to_n((1<<k) + (1<<(k+1))) == natural.fibonacci(k + 4), \
477 (k,
fibonacci_to_n((1<<k) + (1<<(k+1))), natural.fibonacci(k + 4))
479 == natural.fibonacci(k + 2) + natural.fibonacci(k + 4), \
481 natural.fibonacci(k + 2) + natural.fibonacci(k + 4))
482 for n
in range(10000):
487 print(
'ok'); sys.stdout.flush()
490 print(
'fibonacci_to_normal()...', end=
''); sys.stdout.flush()
503 for n
in range(10000):
505 assert bit32.bin(f).find(
'11') == -1, (n, bit32.bin(n), bit32.bin(f), f)
509 print(
'ok'); sys.stdout.flush()
512 print(
'fig()...', end=
''); sys.stdout.flush()
514 for b
in range(2, 20):
515 assert fig(n, 0, b) == n%b, (n, b,
fig(n, 0, b), n%b)
517 assert fig(n, k, b) == (n//(b**k))%b, (n, b, k,
fig(n, k, b), (n//(b**k))%b)
518 print(
'ok'); sys.stdout.flush()
521 print(
'fig_to_chr()...', end=
''); sys.stdout.flush()
530 print(
'ok'); sys.stdout.flush()
533 print(
'figset()...', end=
''); sys.stdout.flush()
535 for b
in range(2, 40
if debug.assertspeed >= debug.ASSERT_NORMAL
else 20):
539 assert fig(new, k, b) == c, (new, b, k,
fig(new, k, b), c)
542 assert fig(new, l, b) ==
fig(n, l, b), \
543 (new, b, k, l,
fig(new, l, b),
fig(n, l, b))
544 if debug.assertspeed < debug.ASSERT_NORMAL:
545 print(debug.assertspeed_str(), end=
'')
546 print(
'ok'); sys.stdout.flush()
549 print(
'list_to()...', end=
''); sys.stdout.flush()
556 for b
in range(2, 50):
557 for n
in range(1000):
562 print(
'ok'); sys.stdout.flush()
565 print(
'str_to()...', end=
''); sys.stdout.flush()
571 for b
in range(2, 37):
572 for n
in range(1000):
575 assert s ==
to_str(new, b), (b, n, new, s,
to_str(new, b))
577 print(
'ok'); sys.stdout.flush()
580 print(
'sum_figs()...', end=
''); sys.stdout.flush()
584 for b
in range(2, 50):
587 for n
in range(2**10):
593 print(
'ok'); sys.stdout.flush()
596 print(
'sum_figs_alt()...', end=
''); sys.stdout.flush()
604 print(
'ok'); sys.stdout.flush()
607 print(
'to_list()...', end=
''); sys.stdout.flush()
614 for n
in range(1, 1000):
615 l = [int(c)
for c
in natural.bin(n)]
618 for b
in range(2, 50):
621 for n
in range(1, b):
623 for i
in range(1, 50):
624 assert to_list(b**i - 1, b) == [b - 1]*i, \
626 assert to_list(b**i, b) == [0]*i + [1], \
628 assert to_list(b**i + 1, b) == [1] + [0]*(i - 1) + [1], \
630 for n
in range(1, 100):
633 for n
in range(1, 2**40, 10000000000):
636 for n
in range(2**32 - 100, 2**32 + 100):
639 print(
'ok'); sys.stdout.flush()
642 print(
'to_str()...', end=
''); sys.stdout.flush()
649 assert to_str(30, 16, caps=
True) ==
'1E',
to_str(30, 16, caps=
True)
650 for n
in range(1000):
651 assert to_str(n) == natural.bin(n), (n,
to_str(n), natural.bin(n))
652 for b
in range(2, 37):
655 for n
in range(0, b):
657 for i
in range(1, 50):
659 (b, i,
to_str(b**i - 1, b))
660 assert to_str(b**i, b) ==
'1' +
'0'*i, \
662 assert to_str(b**i + 1, b) ==
'1' +
'0'*(i - 1) +
'1', \
663 (b, i,
to_str(b**i + 1, b))
664 for n
in range(1, 100):
666 if debug.assertspeed >= debug.ASSERT_NORMAL:
667 for n
in range(1, 2**40, 10000000000):
669 for n
in range(2**32 - 100, 2**32 + 100):
671 if debug.assertspeed < debug.ASSERT_NORMAL:
672 print(debug.assertspeed_str(), end=
'')
673 print(
'ok'); sys.stdout.flush()