34. Repeated Squaring If function f multiplies then f⍨ squares; squaring n times raises to power 2*n and is therefore a fast way to exponentiate. y← 3 ×⍨ y 9 ×⍨ ×⍨ ×⍨ ×⍨ y 43046721 ×⍨⍣4 ⊢y 43046721 y*2*4 43046721 One way to compute the n-th power for an arbitrary n (when n is not a power of 2), is to find the squares corresponding to 1 bits in the binary representation of n , and then compute the product. ⎕pp←18 ⍝ to display all digits y*25 847288609443 2⊥⍣¯1 ⊢25 1 1 0 0 1 powop←{⍺←⊣ ⋄ ⍺∘⍺⍺{⍺⍺⍣⍵⊢⍵⍵}⍵¨⍵⍵} ⍸ ⌽ 2⊥⍣¯1 ⊢25 0 3 4 ×⍨powop 0 3 4 ⊢y 3 6561 43046721 ×/ ×⍨powop 0 3 4 ⊢y 847288609443 pow←{⊃⍺⍺/⍺⍺⍨powop(⍸⌽2⊥⍣¯1⊢⍵)⊢⍺} y ×pow 25 847288609443 powop is a power operator like the primitive ⍣ but extended to allow an array “exponent” (right operand). Moreover, monadic ⊤ can be specified to compute the binary representation [100]. With these extensions, pow can be defined more tersely as pow←{⊃⍺⍺/⍺⍺⍨⍣(⍸⌽⊤⍵)⊢⍺} . This method works for other kinds of multiplication, such as matrix multiplication or multiplication in ring extensions of Z and Q. Both of these are used in computing elements of the Fibonacci sequence. ⊢ m←3 3⍴⍳5 0 1 2 3 4 0 1 2 3 m+.×m+.×m+.×m+.×m+.×m+.×m+.×m+.×m+.×m+.×m 30302130 48622309 23428348 57287403 91922080 44289762 56003936 89862991 43299771 m +.×⍣11 ∘.=⍨⍳≢m 30302130 48622309 23428348 57287403 91922080 44289762 56003936 89862991 43299771 m +.×pow 11 30302130 48622309 23428348 57287403 91922080 44289762 56003936 89862991 43299771 Appeared in J in
[102].
|