Ethiopian multiplication: Difference between revisions

m
 
(48 intermediate revisions by 23 users not shown)
Line 51:
Use these functions to '''create a function that does Ethiopian multiplication'''.
 
;Related tasks:
* [[Egyptian_division|Egyptian division]]
 
;References:
Line 63 ⟶ 65:
=={{header|11l}}==
{{trans|Python}}
<langsyntaxhighlight lang="11l">F halve(x)
R x I/ 2
 
Line 83 ⟶ 85:
R result
 
print(ethiopian(17, 34))</langsyntaxhighlight>
 
{{out}}
Line 99 ⟶ 101:
less elegant, so I've done it this way as a sort of compromise.
 
<langsyntaxhighlight lang="8080asm"> org 100h
jmp demo
;;; HL = BC * DE
Line 151 ⟶ 153:
jmp 5
db '*****'
pbuf: db '$'</langsyntaxhighlight>
{{out}}
<pre>578</pre>
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits <br> or android 64 bits with application Termux }}
<syntaxhighlight lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program multieth64.s */
 
/************************************/
/* Constantes */
/************************************/
.include "../includeConstantesARM64.inc"
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult: .asciz "Result : "
szMessStart: .asciz "Program 64 bits start.\n"
szCarriageReturn: .asciz "\n"
szMessErreur: .asciz "Error overflow. \n"
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
ldr x0,qAdrszMessStart
bl affichageMess
mov x0,#17
mov x1,#34
bl multEthiop
ldr x1,qAdrsZoneConv
bl conversion10 // decimal conversion
mov x0,#3 // number string to display
ldr x1,qAdrszMessResult
ldr x2,qAdrsZoneConv // insert conversion in message
ldr x3,qAdrszCarriageReturn
bl displayStrings // display message
 
100: // standard end of the program
mov x0, #0 // return code
mov x8,EXIT
svc #0 // perform the system call
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrsZoneConv: .quad sZoneConv
qAdrszMessResult: .quad szMessResult
qAdrszMessErreur: .quad szMessErreur
qAdrszMessStart: .quad szMessStart
/******************************************************************/
/* Ethiopian multiplication unsigned */
/******************************************************************/
/* x0 first factor */
/* x1 2th factor */
/* x0 return résult */
multEthiop:
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
mov x2,#0 // init result
1: // loop
cmp x0,#1 // end ?
blt 3f
ands x3,x0,#1 //
add x3,x2,x1 // add factor2 to result
csel x2,x2,x3,eq
mov x3,1
lsr x0,x0,x3 // divide factor1 by 2
cmp x1,0 // overflow ? if bit 63 = 1 ie negative number
blt 2f
mov x4,1
lsl x1,x1,x4 // multiply factor2 by 2
b 1b // or loop
2: // error display
ldr x0,qAdrszMessErreur
bl affichageMess
mov x2,#0
3:
mov x0,x2 // return result
ldp x2,x3,[sp],16 // restaur registers
ldp x1,lr,[sp],16 // restaur registers
ret
/***************************************************/
/* display multi strings */
/***************************************************/
/* x0 contains number strings address */
/* x1 address string1 */
/* x2 address string2 */
/* x3 address string3 */
/* other address on the stack */
/* thinck to add number other address * 8 to add to the stack */
displayStrings: // INFO: displayStrings
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
stp x4,x5,[sp,-16]! // save registers
add fp,sp,#48 // save paraméters address (6 registers saved * 4 bytes)
mov x4,x0 // save strings number
cmp x4,#0 // 0 string -> end
ble 100f
mov x0,x1 // string 1
bl affichageMess
cmp x4,#1 // number > 1
ble 100f
mov x0,x2
bl affichageMess
cmp x4,#2
ble 100f
mov x0,x3
bl affichageMess
cmp x4,#3
ble 100f
mov x3,#3
sub x2,x4,#8
1: // loop extract address string on stack
ldr x0,[fp,x2,lsl #3]
bl affichageMess
subs x2,x2,#1
bge 1b
100:
ldp x4,x5,[sp],16 // restaur registers
ldp x2,x3,[sp],16 // restaur registers
ldp x1,lr,[sp],16 // restaur registers
ret
 
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../includeARM64.inc"
</syntaxhighlight>
{{Out}}
<pre>
Program 64 bits start.
Result : 578
</pre>
 
=={{header|ACL2}}==
<langsyntaxhighlight Lisplang="lisp">(include-book "arithmetic-3/top" :dir :system)
 
(defun halve (x)
Line 172 ⟶ 311:
0
y)
(multiply (halve x) (double y)))))</langsyntaxhighlight>
 
=={{header|Action!}}==
<langsyntaxhighlight Actionlang="action!">INT FUNC EthopianMult(INT a,b)
INT res
 
Line 198 ⟶ 337:
res=EthopianMult(17,34)
PrintF("Result is %I",res)
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Ethiopian_multiplication.png Screenshot from Atari 8-bit computer]
Line 213 ⟶ 352:
=={{header|ActionScript}}==
{{works with|ActionScript|2.0}}
<langsyntaxhighlight ActionScriptlang="actionscript">function Divide(a:Number):Number {
return ((a-(a%2))/2);
}
Line 243 ⟶ 382:
trace("="+" "+r);
}
}</langsyntaxhighlight>{{out}}
ex. Ethiopian(17,34);
17 34
Line 252 ⟶ 391:
 
=={{header|Ada}}==
<syntaxhighlight lang="ada">
<lang Ada>
with ada.text_io;use ada.text_io;
 
Line 266 ⟶ 405:
begin
put_line (mul (17,34)'img);
end ethiopian;</langsyntaxhighlight>
 
=={{header|Aime}}==
{{trans|C}}
<langsyntaxhighlight lang="aime">void
halve(integer &x)
{
Line 326 ⟶ 465:
 
return 0;
}</langsyntaxhighlight>
17 34 kept
8 68 struck
Line 342 ⟶ 481:
 
<!-- {{does not work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386 - missing printf and FORMAT}} -->
<langsyntaxhighlight lang="algol68">PROC halve = (REF INT x)VOID: x := ABS(BIN x SHR 1);
PROC doublit = (REF INT x)VOID: x := ABS(BIN x SHL 1);
PROC iseven = (#CONST# INT x)BOOL: NOT ODD x;
Line 370 ⟶ 509:
(
printf(($g(0)l$, ethiopian(17, 34, TRUE)))
)</langsyntaxhighlight>{{out}}
ethiopian multiplication of 17 by 34
0017 000034 kept
Line 380 ⟶ 519:
 
=={{header|ALGOL-M}}==
<langsyntaxhighlight lang="algol">
BEGIN
 
Line 432 ⟶ 571:
WRITE(ETHIOPIAN(17,34,YES));
 
END</langsyntaxhighlight>
{{out}}
<pre>
Line 444 ⟶ 583:
 
=={{header|ALGOL W}}==
<langsyntaxhighlight lang="algolw">begin
% returns half of a %
integer procedure halve ( integer value a ) ; a div 2;
Line 481 ⟶ 620:
write( " ", m )
end
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 502 ⟶ 641:
See also: [[Repeat_a_string#AppleScript]]
 
<langsyntaxhighlight AppleScriptlang="applescript">on run
{ethMult(17, 34), ethMult("Rhind", 9)}
Line 564 ⟶ 703:
end repeat
return plus(o, m) of fns
end ethMult</langsyntaxhighlight>
 
{{Out}}
 
<pre>{578, "RhindRhindRhindRhindRhindRhindRhindRhindRhind"}</pre>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}}
<syntaxhighlight lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program multieth.s */
 
/* REMARK 1 : this program use routines in a include file
see task Include a file language arm assembly
for the routine affichageMess conversion10
see at end of this program the instruction include */
/* for constantes see task include a file in arm assembly */
/************************************/
/* Constantes */
/************************************/
.include "../constantes.inc"
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessResult: .asciz "Result : "
szMessStart: .asciz "Program 32 bits start.\n"
szCarriageReturn: .asciz "\n"
szMessErreur: .asciz "Error overflow. \n"
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: @ entry of program
ldr r0,iAdrszMessStart
bl affichageMess
mov r0,#17
mov r1,#34
bl multEthiop
ldr r1,iAdrsZoneConv
bl conversion10 @ decimal conversion
mov r0,#3 @ number string to display
ldr r1,iAdrszMessResult
ldr r2,iAdrsZoneConv @ insert conversion in message
ldr r3,iAdrszCarriageReturn
bl displayStrings @ display message
 
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
iAdrszCarriageReturn: .int szCarriageReturn
iAdrsZoneConv: .int sZoneConv
iAdrszMessResult: .int szMessResult
iAdrszMessErreur: .int szMessErreur
iAdrszMessStart: .int szMessStart
/******************************************************************/
/* Ethiopian multiplication */
/******************************************************************/
/* r0 first factor */
/* r1 2th factor */
/* r0 return résult */
multEthiop:
push {r1-r3,lr} @ save registers
mov r2,#0 @ init result
1: @ loop
cmp r0,#1 @ end ?
blt 3f
ands r3,r0,#1 @
addne r2,r1 @ add factor2 to result
lsr r0,#1 @ divide factor1 by 2
lsls r1,#1 @ multiply factor2 by 2
bcs 2f @ overflow ?
b 1b @ or loop
2: @ error display
ldr r0,iAdrszMessErreur
bl affichageMess
mov r2,#0
3:
mov r0,r2 @ return result
pop {r1-r3,pc}
/***************************************************/
/* display multi strings */
/***************************************************/
/* r0 contains number strings address */
/* r1 address string1 */
/* r2 address string2 */
/* r3 address string3 */
/* other address on the stack */
/* thinck to add number other address * 4 to add to the stack */
displayStrings: @ INFO: displayStrings
push {r1-r4,fp,lr} @ save des registres
add fp,sp,#24 @ save paraméters address (6 registers saved * 4 bytes)
mov r4,r0 @ save strings number
cmp r4,#0 @ 0 string -> end
ble 100f
mov r0,r1 @ string 1
bl affichageMess
cmp r4,#1 @ number > 1
ble 100f
mov r0,r2
bl affichageMess
cmp r4,#2
ble 100f
mov r0,r3
bl affichageMess
cmp r4,#3
ble 100f
mov r3,#3
sub r2,r4,#4
1: @ loop extract address string on stack
ldr r0,[fp,r2,lsl #2]
bl affichageMess
subs r2,#1
bge 1b
100:
pop {r1-r4,fp,pc}
 
 
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../affichage.inc"
 
 
</syntaxhighlight>
{{Out}}
<pre>
Program 32 bits start.
Result : 578
</pre>
 
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">halve: function [x]-> shr x 1
double: function [x]-> shl x 1
 
Line 588 ⟶ 860:
 
print ethiopian 17 34
print ethiopian 2 3</langsyntaxhighlight>
 
{{out}}
Line 596 ⟶ 868:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">MsgBox % Ethiopian(17, 34) "`n" Ethiopian2(17, 34)
 
; func definitions:
Line 625 ⟶ 897:
Ethiopian2( a, b, r = 0 ) { ;omit r param on initial call
return a==1 ? r+b : Ethiopian2( half(a), double(b), !isEven(a) ? r+b : r )
}</langsyntaxhighlight>
 
=={{header|AutoIt}}==
<syntaxhighlight lang="autoit">
<lang AutoIt>
Func Halve($x)
Return Int($x/2)
Line 668 ⟶ 940:
 
MsgBox(0, "Ethiopian multiplication of 17 by 34", Ethiopian(17, 34) )
</syntaxhighlight>
</lang>
 
=={{header|AWK}}==
Implemented without the tutor.
<langsyntaxhighlight lang="awk">function halve(x)
{
return int(x/2)
Line 702 ⟶ 974:
BEGIN {
print ethiopian(17, 34)
}</langsyntaxhighlight>
 
=={{header|BASIC}}==
==={{header|Applesoft BASIC}}===
Same code as [[#Nascom_BASIC|Nascom BASIC]]
 
==={{header|ASIC}}===
<langsyntaxhighlight lang="basic">
REM Ethiopian multiplication
X = 17
Line 749 ⟶ 1,023:
ISEVEN = 1 - ISEVEN
RETURN
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 763 ⟶ 1,037:
Works with QBasic. While building the table, it's easier to simply not print unused values, rather than have to go back and strike them out afterward. (Both that and the actual adding happen in the "IF NOT (isEven(x))" block.)
 
<langsyntaxhighlight lang="qbasic">DECLARE FUNCTION half% (a AS INTEGER)
DECLARE FUNCTION doub% (a AS INTEGER)
DECLARE FUNCTION isEven% (a AS INTEGER)
Line 797 ⟶ 1,071:
FUNCTION isEven% (a AS INTEGER)
isEven% = (a MOD 2) - 1
END FUNCTION</langsyntaxhighlight>{{out}}
{{out}}
17 34
<pre> 17 34
8
4
2
1 544
= 578</pre>
 
==={{header|BASIC256}}===
<syntaxhighlight lang="vbnet">outP = 0
x = 17
y = 34
 
while True
print x + chr(09);
if not (isEven(x)) then
outP += y
print y
else
print
end if
if x < 2 then exit while
x = half(x)
y = doub(y)
end while
print "=" + chr(09); outP
end
 
function doub (a)
return a * 2
end function
 
function half (a)
return a \ 2
end function
 
function isEven (a)
return (a mod 2) - 1
end function</syntaxhighlight>
 
==={{header|BBC BASIC}}===
<langsyntaxhighlight lang="bbcbasic"> x% = 17
y% = 34
Line 827 ⟶ 1,134:
DEF FNhalve(A%) = A% DIV 2
DEF FNeven(A%) = ((A% AND 1) = 0)</langsyntaxhighlight>{{out}}
{{out}}
17 34
<pre> 17 34
8 ---
4 ---
Line 834 ⟶ 1,142:
1 544
===
578</pre>
 
==={{header|Chipmunk Basic}}===
{{trans|BASIC256}}
{{works with|Chipmunk Basic|3.6.4}}
<syntaxhighlight lang="vbnet">100 sub doub(a)
110 doub = a*2
120 end sub
130 sub half(a)
140 half = int(a/2)
150 end sub
160 sub iseven(a)
170 iseven = (a mod 2)-1
180 end sub
190 outp = 0
200 x = 17
210 y = 34
220 while 1
230 print x;chr$(9);
240 if not (iseven(x)) then
250 outp = outp - y
260 print y
270 else
280 print
290 endif
300 if x < 2 then exit while
310 x = half(x)
320 y = doub(y)
330 wend
340 print "=";chr$(9);outp
350 end</syntaxhighlight>
 
==={{header|FreeBASIC}}===
<langsyntaxhighlight FreeBASIClang="freebasic">Function double_(y As String) As String
Var answer="0"+y
Var addcarry=0
Line 924 ⟶ 1,262:
Sleep
</langsyntaxhighlight>note: algorithm uses strings instead of integers
{{out}}
{{out}}<pre>Half Double * marks those accumulated
<pre>Half Double * marks those accumulated
Biggest Smallest
 
Line 941 ⟶ 1,280:
 
==={{header|GW-BASIC}}===
{{works with|BASICA}}
<lang qbasic>10 DEF FNE(A)=(A+1) MOD 2
<syntaxhighlight lang="gwbasic">10 REM Ethiopian multiplication
20 DEF FNH(A)=INT(A/2)
3020 DEF FNDFNE(A%) =2* (A% + 1) MOD 2
30 DEF FNH(A%) = A% \ 2
40 X=17:Y=34:TOT=0
40 DEF FND(A%) = 2 * A%
50 WHILE X>=1
50 X% = 17: Y% = 34: TOT% = 0
60 PRINT X,
60 WHILE X% >= 1
70 IF FNE(X)=0 THEN TOT=TOT+Y:PRINT Y ELSE PRINT
70 PRINT USING "###### "; X%;
80 X=FNH(X):Y=FND(Y)
80 IF FNE(X%)=0 THEN TOT% = TOT% + Y%: PRINT USING "###### "; Y% ELSE PRINT
90 WEND
90 X% = FNH(X%): Y% = FND(Y%)
100 PRINT "=", TOT</lang>
100 WEND
110 PRINT USING "= ######"; TOT%
120 END</syntaxhighlight>
{{out}}
<pre>
17 34
8
4
2
1 544
= 578
</pre>
 
==={{header|Liberty BASIC}}===
<langsyntaxhighlight lang="lb">x = 17
y = 34
msg$ = str$(x) + " * " + str$(y) + " = "
Line 981 ⟶ 1,332:
Function doubleInt(num)
doubleInt = Int(num * 2)
End Function</langsyntaxhighlight>
 
 
==={{header|Microsoft Small Basic}}===
<langsyntaxhighlight lang="microsoftsmallbasic">x = 17
x = 17
y = 34
tot = 0
Line 1,003 ⟶ 1,352:
TextWindow.Write("=")
TextWindow.CursorLeft = 10
TextWindow.WriteLine(tot)</syntaxhighlight>
</lang>
 
==={{header|NascomMinimal BASIC}}===
<syntaxhighlight lang="gwbasic">10 REM Ethiopian multiplication
20 DEF FND(A) = 2*A
30 DEF FNH(A) = INT(A/2)
40 DEF FNE(A) = A-INT(A/2)*2-1
50 LET X = 17
60 LET Y = 34
70 LET T = 0
80 IF X < 1 THEN 170
90 IF FNE(X) <> 0 THEN 130
100 LET T = T+Y
110 PRINT X; TAB(9); Y; "(kept)"
120 GOTO 140
130 PRINT X; TAB(9); Y
140 LET X = FNH(X)
150 LET Y = FND(Y)
160 GOTO 80
170 PRINT "------------"
180 PRINT "= "; TAB(9); T; "(sum of kept second vals)"
190 END</syntaxhighlight>
 
==={{header|MSX Basic}}===
{{works with|MSX BASIC|any}}
Same code as [[#Nascom_BASIC|Nascom BASIC]]
 
==={{header|Nascom BASIC}}===
{{trans|Modula-2}}
{{works with|Nascom ROM BASIC|4.7}}
<syntaxhighlight lang="basic">10 REM Ethiopian multiplication
<lang basic>
10 REM Ethiopian multiplication
20 DEF FND(A)=2*A
30 DEF FNH(A)=INT(A/2)
40 DEF FNE(A)=XA-INT(XA/2)*2-1
50 X=17
60 Y=34
Line 1,030 ⟶ 1,402:
1000 S$=STR$(NR)
1010 PRINT SPC(9-LEN(S$));S$;
1020 RETURN</syntaxhighlight>
</lang>
{{out}}
<pre> 17 34
17 34
8
4
2
1 544
= 578</pre>
</pre>
 
==={{header|PureBasic}}===
<langsyntaxhighlight PureBasiclang="purebasic">Procedure isEven(x)
ProcedureReturn (x & 1) ! 1
EndProcedure
Line 1,075 ⟶ 1,444:
Input()
CloseConsole()
EndIf</langsyntaxhighlight>
{{out}}
Ethiopian multiplication of 17 and 34 ... equals 578
It became apparent that according to the way the Ethiopian method is described above it can't produce a correct result if the first multiplicand (the one being repeatedly halved) is negative. I've addressed that in this variation. If the first multiplicand is negative then the resulting sum (which may already be positive or negative) is negated.
<langsyntaxhighlight PureBasiclang="purebasic">Procedure isEven(x)
ProcedureReturn (x & 1) ! 1
EndProcedure
Line 1,116 ⟶ 1,485:
Input()
CloseConsole()
EndIf</langsyntaxhighlight>
{{out}}
<pre> Ethiopian multiplication of 17 and 34 ... equals 578
Ethiopian multiplication of -17 and 34 ... equals -578
Ethiopian multiplication of -17 and -34 ... equals 578</pre>
 
==={{header|QB64}}===
<langsyntaxhighlight lang="qbasic">PRINT multiply(17, 34)
 
SUB twice (n AS LONG)
Line 1,147 ⟶ 1,516:
WEND
multiply& = result
END FUNCTION</langsyntaxhighlight>
{{out}}
<pre>578</pre>
578
</pre>
 
==={{header|Sinclair ZX81 BASIC}}===
Requires at least 2k of RAM. The specification is emphatic about wanting named functions: in a language where user-defined functions do not exist, the best we can do is to use subroutines and assign their line numbers to variables. This allows us to <code>GOSUB HALVE</code> instead of having to <code>GOSUB 320</code>. (It would however be more idiomatic to avoid using subroutines at all, for simple operations like these, and to refer to them by line number if they were used.)
<langsyntaxhighlight lang="basic"> 10 LET HALVE=320
20 LET DOUBLE=340
30 LET EVEN=360
Line 1,192 ⟶ 1,559:
360 LET Y=X/2=INT (X/2)
370 RETURN
380 PRINT AT I+1,16;A</langsyntaxhighlight>
{{in}}
<pre>17
Line 1,206 ⟶ 1,573:
 
==={{header|Tiny BASIC}}===
<langsyntaxhighlight lang="tinybasic">
REM Ethiopian multiplication
LET X=17
Line 1,242 ⟶ 1,609:
REM A - param.; E - result (0 - false)
400 LET E=A-(A/2)*2
RETURN </syntaxhighlight>
</lang>
{{out}}
<pre>17, 34 (kept)
17, 34 (kept)
8, 68
4, 136
Line 1,252 ⟶ 1,617:
1, 544 (kept)
------------
= 578 (sum of kept second vals)</pre>
</pre>
 
==={{header|True BASIC}}===
A translation of BBC BASIC. True BASIC does not have Boolean operations built-in.
<syntaxhighlight lang="basic">!RosettaCode: Ethiopian Multiplication
<lang basic>
!RosettaCode: Ethiopian Multiplication
! True BASIC v6.007
PROGRAM EthiopianMultiplication
Line 1,286 ⟶ 1,649:
DEF FNhalve(A) = INT(A / 2)
DEF FNeven(A) = MOD(A+1,2)
END</syntaxhighlight>
END
 
</lang>
 
==={{header|XBasic}}===
{{trans|Modula-2}}
{{works with|Windows XBasic}}
<syntaxhighlight lang="xbasic">' Ethiopian multiplication
<lang xbasic>
' Ethiopian multiplication
PROGRAM "ethmult"
VERSION "0.0000"
Line 1,334 ⟶ 1,694:
RETURN a&& MOD 2 = 0
END FUNCTION
END PROGRAM</syntaxhighlight>
</lang>
{{out}}
<pre> 17 34
17 34
8
4
2
1 544
= 578</pre>
 
</pre>
==={{header|Yabasic}}===
<syntaxhighlight lang="vbnet">outP = 0
x = 17
y = 34
 
do
print x, chr$(09);
if not (isEven(x)) then
outP = outP + y
print y
else
print
fi
if x < 2 break
x = half(x)
y = doub(y)
loop
print "=", chr$(09), outP
end
 
sub doub (a)
return a * 2
end sub
 
sub half (a)
return int(a / 2)
end sub
 
sub isEven (a)
return mod(a, 2) - 1
end sub</syntaxhighlight>
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">
@echo off
:: Pick 2 random, non-zero, 2-digit numbers to send to :_main
Line 1,426 ⟶ 1,815:
set /a modint=%int% %% 2
exit /b %modint%
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,439 ⟶ 1,828:
 
=={{header|BCPL}}==
<langsyntaxhighlight lang="bcpl">get "libhdr"
 
let halve(i) = i>>1
Line 1,450 ⟶ 1,839:
emulr(halve(x), double(y), even(x) -> ac, ac + y)
let start() be writef("%N*N", emul(17, 34))</langsyntaxhighlight>
{{out}}
<pre>578</pre>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( (halve=.div$(!arg.2))
& (double=.2*!arg)
& (isEven=.mod$(!arg.2):0)
Line 1,479 ⟶ 1,868:
)
& out$(mul$(17.34))
);</langsyntaxhighlight>
Output
<pre>578</pre>
Line 1,485 ⟶ 1,874:
=={{header|BQN}}==
 
<langsyntaxhighlight lang="bqn">Double ← 2⊸×
Halve ← ⌊÷⟜2
Odd ← 2⊸|
Line 1,494 ⟶ 1,883:
}
 
17 EMul 34</langsyntaxhighlight><syntaxhighlight lang="text">578</langsyntaxhighlight>
 
To avoid using a while loop, the iteration count is computed beforehand.
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdbool.h>
 
Line 1,530 ⟶ 1,919:
printf("%d\n", ethiopian(17, 34, true));
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
Line 1,536 ⟶ 1,925:
{{works with|c sharp|C#|3+}}<br>
{{libheader|System.Linq}}<br>
<langsyntaxhighlight lang="csharp">
using System;
using System.Linq;
Line 1,598 ⟶ 1,987:
}
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
Line 1,606 ⟶ 1,995:
Here is such an implementation without tutor, since there is no mechanism in C++ to output
messages during program compilation.
<langsyntaxhighlight lang="cpp">template<int N>
struct Half
{
Line 1,659 ⟶ 2,048:
std::cout << EthiopianMultiplication<17, 54>::Result << std::endl;
return 0;
}</langsyntaxhighlight>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="lisp">(defn halve [n]
(bit-shift-right n 1))
 
Line 1,686 ⟶ 2,075:
(if (even a)
(recur (halve a) (twice b) r)
(recur (halve a) (twice b) (+ r b))))))</langsyntaxhighlight>
 
=={{header|CLU}}==
<langsyntaxhighlight lang="clu">halve = proc (n: int) returns (int)
return(n/2)
end halve
Line 1,716 ⟶ 2,105:
po: stream := stream$primary_output()
stream$putl(po, int$unparse(e_mul(17, 34)))
end start_up</langsyntaxhighlight>
{{out}}
<pre>578</pre>
Line 1,725 ⟶ 2,114:
{{works with|OpenCOBOL|1.1}}
In COBOL, ''double'' is a reserved word, so the doubling functions is named ''twice'', instead.
<langsyntaxhighlight COBOLlang="cobol"> *>* Ethiopian multiplication
 
IDENTIFICATION DIVISION.
Line 1,817 ⟶ 2,206:
SUBTRACT m FROM 1 GIVING m END-SUBTRACT
GOBACK.
END PROGRAM evenp.</langsyntaxhighlight>
 
=={{header|CoffeeScript}}==
<langsyntaxhighlight lang="coffeescript">
halve = (n) -> Math.floor n / 2
double = (n) -> n * 2
Line 1,838 ⟶ 2,227:
for j in [0..100]
throw Error("broken for #{i} * #{j}") if multiply(i,j) != i * j
</syntaxhighlight>
</lang>
 
=== CoffeeScript "One-liner" ===
 
ethiopian = (a, b, r=0) -> if a <= 0 then r else ethiopian a // 2, b * 2, if a % 2 then r + b else r
 
=={{header|ColdFusion}}==
Version with as a function of functions:
 
<langsyntaxhighlight lang="cfm"><cffunction name="double">
<cfargument name="number" type="numeric" required="true">
<cfset answer = number * 2>
Line 1,877 ⟶ 2,270:
 
 
<cfoutput>#ethiopian(17,34)#</cfoutput></langsyntaxhighlight>Version with display pizza:<syntaxhighlight lang ="cfm"><cfset Number_A = 17>
<cfset Number_B = 34>
<cfset Result = 0>
Line 1,933 ⟶ 2,326:
...equals #Result#
 
</cfoutput></langsyntaxhighlight>
Sample output:<pre>
Ethiopian multiplication of 17 and 34...
Line 1,946 ⟶ 2,339:
=={{header|Common Lisp}}==
 
Common Lisp already has <code>evenp</code>, but all three of <code>halve</code>, <code>double</code>, and <code>even-p</code> are locally defined within <code>ethiopian-multiply</code>. (Note that the termination condition is <code>(zerop l)</code> because we terminate 'after' the iteration wherein the left column contains 1, and <code>(halve 1)</code> is 0.)<langsyntaxhighlight lang="lisp">(defun ethiopian-multiply (l r)
(flet ((halve (n) (floor n 2))
(double (n) (* n 2))
Line 1,953 ⟶ 2,346:
(l l (halve l))
(r r (double r)))
((zerop l) product))))</langsyntaxhighlight>
 
=={{header|Craft Basic}}==
<syntaxhighlight lang="basic">let x = 17
let y = 34
let s = 0
 
do
 
if x < 1 then
 
break
 
endif
 
if s = 1 then
 
print x
 
endif
 
if s = 0 then
 
let s = 1
 
endif
 
let a = x
let e = a % 2
let e = 1 - e
 
if e = 0 then
 
let t = t + y
print x, " ", y
 
endif
 
let a = x
let a = int(a / 2)
let x = a
let a = y
let a = 2 * a
let y = a
 
loop x >= 1
 
print "="
print t</syntaxhighlight>
{{out| Output}}<pre>17 34
8
4
2
1
1 544
=
578</pre>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">int ethiopian(int n1, int n2) pure nothrow @nogc
in {
assert(n1 >= 0, "Multiplier can't be negative");
Line 1,983 ⟶ 2,432:
 
writeln("17 ethiopian 34 is ", ethiopian(17, 34));
}</langsyntaxhighlight>{{out}}
17 ethiopian 34 is 578
 
=={{header|dc}}==
<langsyntaxhighlight lang="dc">0k [ Make sure we're doing integer division ]sx
[ 2 / ] sH [ Define "halve" function in register H ]sx
[ 2 * ] sD [ Define "double" function in register D ]sx
Line 2,016 ⟶ 2,465:
 
[ Demo by multiplying 17 and 34 ]sx
17 34 lMx p</langsyntaxhighlight>
{{out}}
578
=={{header|Delphi}}==
See [https://rosettacode.org/wiki/Ethiopian_multiplication#Pascal Pascal].
 
=={{header|Draco}}==
<syntaxhighlight lang="draco">proc nonrec halve(word n) word: n >> 1 corp
proc nonrec double(word n) word: n << 1 corp
proc nonrec even(word n) bool: n & 1 = 0 corp
 
proc nonrec emul(word a, b) word:
word total;
total := 0;
while a > 0 do
if not even(a) then total := total + b fi;
a := halve(a);
b := double(b)
od;
total
corp
 
proc nonrec main() void: writeln(emul(17, 34)) corp</syntaxhighlight>
{{out}}
<pre>578</pre>
 
=={{header|E}}==
<langsyntaxhighlight lang="e">def halve(&x) { x //= 2 }
def double(&x) { x *= 2 }
def even(x) { return x %% 2 <=> 0 }
Line 2,035 ⟶ 2,504:
}
return ab
}</langsyntaxhighlight>
 
=={{header|EasyLang}}==
<syntaxhighlight>
{{trans|Microsoft Small Basic}}
func mult x y .
<lang>x = 17
while x >= 1
y = 34
if x mod 2 <> 0
tot = 0
tot += y
while x >= 1
write x .
x = x div 2
write "\t"
if (x + 1) mod 2y *= 02
tot += y.
return print ytot
else
print ""
.
x = x div 2
y = 2 * y
.
print mult 17 34
write "=\t"
</syntaxhighlight>
print tot</lang>
 
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
<lang Eiffel>
class
APPLICATION
Line 2,118 ⟶ 2,582:
end
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,126 ⟶ 2,590:
=={{header|Ela}}==
Translation of Haskell:
<langsyntaxhighlight lang="ela">open list number
halve x = x `div` 2
Line 2,135 ⟶ 2,599:
(iterate double b)
 
ethiopicmult 17 34</langsyntaxhighlight>{{out}}
578
 
=={{header|Elixir}}==
{{trans|Erlang}}
<langsyntaxhighlight lang="elixir">defmodule Ethiopian do
def halve(n), do: div(n, 2)
Line 2,158 ⟶ 2,622:
end
 
IO.inspect Ethiopian.multiply(17, 34)</langsyntaxhighlight>
 
{{out}}
Line 2,167 ⟶ 2,631:
=={{header|Emacs Lisp}}==
Emacs Lisp has <code>cl-evenp</code> in cl-lib.el (its Common Lisp library), but for the sake of completeness the desired effect is achieved here via <code>mod</code>.
<syntaxhighlight lang="lisp">(defun even-p (n)
<lang lisp>
(defun even-p (n)
(= (mod n 2) 0))
(defun halve (n)
Line 2,181 ⟶ 2,644:
(setq l (halve l))
(setq r (double r)))
sum))</syntaxhighlight>
 
</lang>
=={{header|EMal}}==
<syntaxhighlight lang="emal">
fun halve = int by int value do return value / 2 end
fun double = int by int value do return value * 2 end
fun isEven = logic by int value do return value % 2 == 0 end
fun ethiopian = int by int multiplicand, int multiplier
int product
while multiplicand >= 1
if not isEven(multiplicand) do product += multiplier end
multiplicand = halve(multiplicand)
multiplier = double(multiplier)
end
return product
end
writeLine(ethiopian(17, 34))
</syntaxhighlight>
 
{{out}}
<pre>
578
</pre>
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">-module(ethopian).
-export([multiply/2]).
 
Line 2,209 ⟶ 2,693:
false ->
multiply(halve(LHS),double(RHS),Acc+RHS)
end.</langsyntaxhighlight>
 
=={{header|ERRE}}==
<langsyntaxhighlight ERRElang="erre">PROGRAM ETHIOPIAN_MULT
 
FUNCTION EVEN(A)
Line 2,235 ⟶ 2,719:
PRINT("=",TOT)
END PROGRAM
</syntaxhighlight>
</lang>
{{out}}
17 34
Line 2,245 ⟶ 2,729:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">function emHalf(integer n)
return floor(n/2)
end function
Line 2,275 ⟶ 2,759:
 
printf(1,"\nPress Any Key\n",{})
while (get_key() = -1) do end while</langsyntaxhighlight>
 
=={{header|F Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">let ethopian n m =
let halve n = n / 2
let double n = n * 2
Line 2,286 ⟶ 2,770:
else if even n then loop (halve n) (double m) result
else loop (halve n) (double m) (result + m)
loop n m 0</langsyntaxhighlight>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: arrays kernel math multiline sequences ;
IN: ethiopian-multiplication
 
Line 2,305 ⟶ 2,789:
[ odd? [ + ] [ drop ] if ] 2keep
[ double ] [ halve ] bi*
] while 2drop ;</langsyntaxhighlight>
 
=={{header|FALSE}}==
<langsyntaxhighlight lang="false">[2/]h:
[2*]d:
[$2/2*-]o:
[0[@$][$o;![@@\$@+@]?h;!@d;!@]#%\%]m:
17 34m;!. {578}</langsyntaxhighlight>
 
=={{header|Forth}}==
Halve and double are standard words, spelled '''2/''' and '''2*''' respectively.
<langsyntaxhighlight lang="forth">: even? ( n -- ? ) 1 and 0= ;
: e* ( x y -- x*y )
dup 0= if nip exit then
over 2* over 2/ recurse
swap even? if nip else + then ;</langsyntaxhighlight>The author of Forth, Chuck Moore, designed a similar primitive into his MISC Forth microprocessors. The '''+*''' instruction is a multiply step: it adds S to T if A is odd, then shifts both A and T right one. The idea is that you only need to perform as many of these multiply steps as you have significant bits in the operand.(See his [http://www.colorforth.com/inst.htm core instruction set] for details.)
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}<langsyntaxhighlight lang="fortran">program EthiopicMult
implicit none
 
Line 2,380 ⟶ 2,864:
end function ethiopic
 
end program EthiopicMult</langsyntaxhighlight>
 
=={{header|Fōrmulæ}}==
 
{{FormulaeEntry|page=https://formulae.org/?script=examples/Ancient_Egyptian_multiplication}}
Fōrmulæ programs are not textual, visualization/edition of programs is done showing/manipulating structures but not text. Moreover, there can be multiple visual representations of the same program. Even though it is possible to have textual representation &mdash;i.e. XML, JSON&mdash; they are intended for storage and transfer purposes more than visualization and edition.
 
'''Solution'''
Programs in Fōrmulæ are created/edited online in its [https://formulae.org website], However they run on execution servers. By default remote servers are used, but they are limited in memory and processing power, since they are intended for demonstration and casual use. A local server can be downloaded and installed, it has no limitations (it runs in your own computer). Because of that, example programs can be fully visualized and edited, but some of them will not run if they require a moderate or heavy computation/memory resources, and no local server is being used.
 
[[File:Fōrmulæ - Ancient Egyptian multiplication 01.png]]
In '''[https://formulae.org/?example=Ancient_Egyptian_multiplication this]''' page you can see the program(s) related to this task and their results.
 
'''Test case'''
 
[[File:Fōrmulæ - Ancient Egyptian multiplication 02.png]]
 
[[File:Fōrmulæ - Ancient Egyptian multiplication 03.png]]
 
Because the required functions are either simple or intrinsic, the solution can be much simpler:
 
[[File:Fōrmulæ - Ancient Egyptian multiplication 04.png]]
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
local fn Doubled( n as long ) : end fn = n * 2
local fn Halved( n as long ) : end fn = int( n / 2 )
local fn IsEven( n as long ) : end fn = ( n mod 2 ) - 1
local fn EthiopianMultiply( x as long, y as long )
long sum = 0, sign = x
printf @"Ethiopian multiplication of %3ld x %3ld = \b", x, y
do
if not ( fn IsEven( x ) ) then sum += y
x = fn Halved( x ) : y = fn Doubled( y )
until ( x == 0 )
if sign < 0 then sum *= - 1
printf @"%4ld", sum
end fn
 
fn EthiopianMultiply( 17, 34 )
fn EthiopianMultiply( -17, 34 )
fn EthiopianMultiply( -17, -34 )
 
HandleEvents
</syntaxhighlight>
{{output}}
<pre>
Ethiopian multiplication of 17 x 34 = 578
Ethiopian multiplication of -17 x 34 = -578
Ethiopian multiplication of -17 x -34 = 578
</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 2,412 ⟶ 2,936:
func main() {
fmt.Printf("17 ethiopian 34 = %d\n", ethMulti(17, 34))
}</langsyntaxhighlight>
 
=={{header|Haskell}}==
===Using integer (+)===
<langsyntaxhighlight lang="haskell">import Prelude hiding (odd)
import Control.Monad (join)
 
Line 2,436 ⟶ 2,960:
 
main :: IO ()
main = print $ ethiopicmult 17 34 == 17 * 34</langsyntaxhighlight>
{{Out}}
<pre>*Main> ethiopicmult 17 34
Line 2,446 ⟶ 2,970:
Logging the stages of the '''unfoldr''' and '''foldr''' applications:
 
<langsyntaxhighlight lang="haskell">import Data.List (inits, intercalate, unfoldr)
import Data.Tuple (swap)
import Debug.Trace (trace)
Line 2,500 ⟶ 3,024:
main = do
print $ ethMult 17 34
print $ ethMult 34 17</langsyntaxhighlight>
{{Out}}
<pre>halve: (8,1)
Line 2,538 ⟶ 3,062:
This additional generality means that our '''ethMult''' function can now replicate a string n times as readily as it multiplies an integer n times, or raises an integer to the nth power.
 
<langsyntaxhighlight lang="haskell">import Control.Monad (join)
import Data.List (unfoldr)
import Data.Monoid (getProduct, getSum)
Line 2,544 ⟶ 3,068:
 
----------------- ETHIOPIAN MULTIPLICATION ---------------
 
ethMult ::
ethMult :: (Monoid m) => Int -> m -> m
Int ->
m ->
m
ethMult n m =
foldr addedWhereOdd mempty $
zip (unfoldr half n) $ iterate (join (<>)) m
 
where
half :: Integral b => b -> Maybe (b, b)
half n
half n
| 0 /= n = Just . swap $ quotRem n 2
| 0 /= n = Just . swap $ quotRem n 2
| otherwise = Nothing
| otherwise = Nothing
addedWhereOdd (d, x) a
 
| 0 /= d = a <> x
addedWhereOdd :: (Eq a, Num a, Semigroup p) => (a, p) -> p -> p
| otherwise = a
addedWhereOdd (d, x) a
| 0 /= d = a <> x
| otherwise = a
 
--------------------------- TEST -------------------------
Line 2,570 ⟶ 3,094:
<> (getProduct <$> ([ethMult 17] <*> [3, 4]))
print $ ethMult 17 "34"
print $ ethMult 17 [3, 4]</langsyntaxhighlight>
{{Out}}
<pre>578
Line 2,580 ⟶ 3,104:
 
=={{header|HicEst}}==
<langsyntaxhighlight lang="hicest"> WRITE(Messagebox) ethiopian( 17, 34 )
END ! of "main"
 
Line 2,605 ⟶ 3,129:
FUNCTION isEven( x )
isEven = MOD(x, 2) == 0
END </langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main(arglist)
while ethiopian(integer(get(arglist)),integer(get(arglist))) # multiply successive pairs of command line arguments
end
Line 2,629 ⟶ 3,153:
procedure even(i)
return ( i % 2 = 0, i )
end</langsyntaxhighlight>While not it seems a task requirement, most implementations have a tutorial version. This seemed easiest in an iterative version.<langsyntaxhighlight Iconlang="icon">procedure ethiopian(i,j) # iterative tutor
local p,w
w := *j+3
Line 2,647 ⟶ 3,171:
write(right("=",w),right(p,w))
return p
end</langsyntaxhighlight>
 
=={{header|J}}==
'''Solution''':<langsyntaxhighlight lang="j">double =: 2&*
halve =: %&2 NB. or the primitive -:
odd =: 2&|
 
ethiop =: +/@(odd@] # (double~ <@#)) (1>.<.@halve)^:a:</langsyntaxhighlight>
 
'''Example''':
Line 2,664 ⟶ 3,188:
17 34 68 136 272
 
Note: this implementation assumes that the number on the right is a positive integer. In contexts where it can be negative, its absolute value should be used and you should multiply the result of ethiop by its sign.<langsyntaxhighlight lang="j">ethio=: *@] * (ethiop |)</langsyntaxhighlight>
 
Alternatively, if multiplying by negative 1 is prohibited, you can use a conditional function which optionally negates its argument.<langsyntaxhighlight lang="j">ethio=: *@] -@]^:(0 > [) (ethiop |)</langsyntaxhighlight>
Examples:<langsyntaxhighlight lang="j"> 7 ethio 11
77
7 ethio _11
Line 2,674 ⟶ 3,198:
_77
_7 ethio _11
77</langsyntaxhighlight>
 
=={{header|Java}}==
{{works with|Java|1.5+}}
<langsyntaxhighlight lang="java5">import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
Line 2,718 ⟶ 3,242:
return (num & 1) == 0;
}
}</langsyntaxhighlight>An optimised variant using the three helper functions from the other example.<langsyntaxhighlight lang="java5">/**
* This method will use ethiopian styled multiplication.
* @param a Any non-negative integer.
Line 2,768 ⟶ 3,292:
}
return result;
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">var eth = {
halve : function ( n ){ return Math.floor(n/2); },
Line 2,794 ⟶ 3,318:
}
}
// eth.mult(17,34) returns 578</langsyntaxhighlight>
 
 
Line 2,804 ⟶ 3,328:
 
 
<langsyntaxhighlight lang="javascript">function ethMult(m, n) {
var o = !isNaN(m) ? 0 : ''; // same technique works with strings
if (n < 1) return o;
Line 2,815 ⟶ 3,339:
}
 
ethMult(17, 34)</langsyntaxhighlight>
 
{{Out}}
Line 2,824 ⟶ 3,348:
Note that the same function will also multiply strings with some efficiency, particularly where n is larger. See [[Repeat_a_string]]
 
<syntaxhighlight lang ="javascript">ethMult('Ethiopian', 34)</langsyntaxhighlight>
 
{{Out}}
Line 2,837 ⟶ 3,361:
The following implementation is intended for jq 1.4 and later.
 
If your jq has <tt>while/2</tt>, then the implementation of the inner function, <tt>pairs</tt>, can be simplified to:<langsyntaxhighlight lang="jq">def pairs: while( .[0] > 0; [ (.[0] | halve), (.[1] | double) ]);</langsyntaxhighlight><syntaxhighlight lang ="jq">def halve: (./2) | floor;
 
def double: 2 * .;
Line 2,851 ⟶ 3,375:
| select( .[0] | isEven | not)
| .[1] ) as $i
(0; . + $i) ;</langsyntaxhighlight>Example:<syntaxhighlight lang ="jq">ethiopian_multiply(17;34) # => 578</langsyntaxhighlight>
 
=={{header|Jsish}}==
From Javascript entry.
<langsyntaxhighlight lang="javascript">/* Ethiopian multiplication in Jsish */
var eth = {
halve : function(n) { return Math.floor(n / 2); },
Line 2,883 ⟶ 3,407:
eth.mult(17,34) ==> 578
=!EXPECTEND!=
*/</langsyntaxhighlight>
 
{{out}}
Line 2,892 ⟶ 3,416:
{{works with|Julia|0.6}}
'''Helper functions''' (type stable):
<langsyntaxhighlight lang="julia">halve(x::Integer) = x >> one(x)
double(x::Integer) = Int8(2) * x
even(x::Integer) = x & 1 != 1</langsyntaxhighlight>
 
'''Main function''':
<langsyntaxhighlight lang="julia">function ethmult(a::Integer, b::Integer)
r = 0
while a > 0
Line 2,907 ⟶ 3,431:
end
 
@show ethmult(17, 34)</langsyntaxhighlight>
 
'''Array version''' (more similar algorithm to the one from the task description):
<langsyntaxhighlight lang="julia">function ethmult2(a::Integer, b::Integer)
A = [a]
B = [b]
Line 2,920 ⟶ 3,444:
end
 
@show ethmult2(17, 34)</langsyntaxhighlight>
 
{{out}}
Line 2,937 ⟶ 3,461:
 
=={{header|Kotlin}}==
 
<lang scala>// version 1.1.2
<syntaxhighlight lang="scala">// version 1.1.2
 
fun halve(n: Int) = n / 2
Line 2,960 ⟶ 3,485:
println("17 x 34 = ${ethiopianMultiply(17, 34)}")
println("99 x 99 = ${ethiopianMultiply(99, 99)}")
}</langsyntaxhighlight>
 
{{out}}
Line 2,967 ⟶ 3,492:
99 x 99 = 9801
</pre>
 
=== Literally follow the algorithm using generateSequence() ===
<syntaxhighlight lang="kotlin">
fun Int.halve() = this shr 1
fun Int.double() = this shl 1
fun Int.isOdd() = this and 1 == 1
 
 
fun ethiopianMultiply(n: Int, m: Int): Int =
generateSequence(Pair(n, m)) { p -> Pair(p.first.halve(), p.second.double()) }
.takeWhile { it.first >= 1 }.filter { it.first.isOdd() }.sumOf { it.second }
 
fun main() {
ethiopianMultiply(17, 34).also { println(it) } // 578
ethiopianMultiply(99, 99).also { println(it) } // 9801
ethiopianMultiply(4, 8).also { println(it) } // 32
}
</syntaxhighlight>
 
=={{header|Lambdatalk}}==
A translation from the javascript entry.
 
<syntaxhighlight lang="scheme">
<lang Scheme>
{def halve {lambda {:n} {floor {/ :n 2}}}}
-> halve
Line 2,998 ⟶ 3,541:
-> 578
 
</syntaxhighlight>
</lang>
 
=={{header|Limbo}}==
<langsyntaxhighlight Limbolang="limbo">implement Ethiopian;
 
include "sys.m";
Line 3,055 ⟶ 3,598:
return product;
}
</syntaxhighlight>
</lang>
 
=={{header|Locomotive Basic}}==
 
<langsyntaxhighlight lang="locobasic">10 DEF FNiseven(a)=(a+1) MOD 2
20 DEF FNhalf(a)=INT(a/2)
30 DEF FNdouble(a)=2*a
Line 3,068 ⟶ 3,611:
80 x=FNhalf(x):y=FNdouble(y)
90 WEND
100 PRINT "=", tot</langsyntaxhighlight>
 
Output:
Line 3,081 ⟶ 3,624:
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">to double :x
output ashift :x 1
end
Line 3,095 ⟶ 3,638:
[output eproduct halve :x double :y] ~
[output :y + eproduct halve :x double :y]
end</langsyntaxhighlight>
 
=={{header|LOLCODE}}==
<langsyntaxhighlight lang="lolcode">HAI 1.3
 
HOW IZ I Halve YR Integer
Line 3,127 ⟶ 3,670:
 
VISIBLE I IZ EthiopianProdukt YR 17 AN YR 34 MKAY
KTHXBYE</langsyntaxhighlight>
 
Output: <pre>578</pre>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function halve(a)
return a/2
end
Line 3,159 ⟶ 3,702:
end
 
print(ethiopian(17, 34))</langsyntaxhighlight>
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module EthiopianMultiplication{
Form 60, 25
Line 3,196 ⟶ 3,739:
}
EthiopianMultiplication
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">IntegerHalving[x_]:=Floor[x/2]
IntegerDoubling[x_]:=x*2;
OddInteger OddQ
Line 3,205 ⟶ 3,748:
Total[Select[NestWhileList[{IntegerHalving[#[[1]]],IntegerDoubling[#[[2]]]}&, {x,y}, (#[[1]]>1&)], OddQ[#[[1]]]&]][[2]]
 
Ethiopian[17, 34]</langsyntaxhighlight>
 
Output:
Line 3,216 ⟶ 3,759:
 
halveInt.m:
<langsyntaxhighlight MATLABlang="matlab">function result = halveInt(number)
result = idivide(number,2,'floor');
 
end</langsyntaxhighlight>
 
doubleInt.m:
<langsyntaxhighlight MATLABlang="matlab">function result = doubleInt(number)
 
result = times(2,number);
 
end</langsyntaxhighlight>
 
isEven.m:
<langsyntaxhighlight MATLABlang="matlab">%Returns a logical 1 if the number is even, 0 otherwise.
function trueFalse = isEven(number)
 
trueFalse = logical( mod(number,2)==0 );
end</langsyntaxhighlight>
 
ethiopianMultiplication.m:
<langsyntaxhighlight MATLABlang="matlab">function answer = ethiopianMultiplication(multiplicand,multiplier)
%Generate columns
Line 3,252 ⟶ 3,795:
answer = sum(multiplier);
end</langsyntaxhighlight>
 
Sample input: (with data type coercion)
<langsyntaxhighlight MATLABlang="matlab">ethiopianMultiplication( int32(17),int32(34) )
 
ans =
 
578
</syntaxhighlight>
</lang>
 
=={{header|Maxima}}==
<syntaxhighlight lang="maxima">
/* Function to halve */
halve(n):=floor(n/2)$
 
/* Function to double */
double(n):=2*n$
 
/* Predicate function to check wether an integer is even */
my_evenp(n):=if mod(n,2)=0 then true$
 
/* Function that implements ethiopian function using the three previously defined functions */
ethiopian(n1,n2):=block(cn1:n1,cn2:n2,list_w:[],
while cn1>0 do (list_w:endcons(cn1,list_w),cn1:halve(cn1)),
n2_list:append([cn2],makelist(cn2:double(cn2),length(list_w)-1)),
sublist_indices(list_w,lambda([x],not my_evenp(x))),
makelist(n2_list[i],i,%%),
apply("+",%%))$
</syntaxhighlight>
 
=={{header|Metafont}}==
Implemented without the ''tutor''.
<langsyntaxhighlight lang="metafont">vardef halve(expr x) = floor(x/2) enddef;
vardef double(expr x) = x*2 enddef;
vardef iseven(expr x) = if (x mod 2) = 0: true else: false fi enddef;
Line 3,283 ⟶ 3,846:
 
show( (17 ethiopicmult 34) );
end</langsyntaxhighlight>
 
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">П1 П2 <-> П0
ИП0 1 - x#0 29
ИП1 2 * П1
Line 3,292 ⟶ 3,855:
2 / {x} x#0 04 ИП2 ИП1 + П2
БП 04
ИП2 С/П</langsyntaxhighlight>
 
=={{header|MMIX}}==
Line 3,298 ⟶ 3,861:
In order to assemble and run this program you'll have to install MMIXware from [http://www-cs-faculty.stanford.edu/~knuth/mmix-news.html]. This provides you with a simple assembler, a simulator, example programs and full documentation.
 
<langsyntaxhighlight lang="mmix">A IS 17
B IS 34
 
Line 3,348 ⟶ 3,911:
% 'str' points to the start of the result
TRAP 0,Fputs,StdOut % output answer to stdout
TRAP 0,Halt,0 % exit</langsyntaxhighlight>
Assembling:
<pre>~/MIX/MMIX/Progs> mmixal ethiopianmult.mms</pre>
Line 3,357 ⟶ 3,920:
=={{header|Modula-2}}==
{{works with|ADW Modula-2|any (Compile with the linker option ''Console Application'').}}
<langsyntaxhighlight lang="modula2">
MODULE EthiopianMultiplication;
 
Line 3,402 ⟶ 3,965:
WriteLn;
END EthiopianMultiplication.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,415 ⟶ 3,978:
=={{header|Modula-3}}==
{{trans|Ada}}
<langsyntaxhighlight lang="modula3">MODULE Ethiopian EXPORTS Main;
 
IMPORT IO, Fmt;
Line 3,452 ⟶ 4,015:
BEGIN
IO.Put("17 times 34 = " & Fmt.Int(Multiply(17, 34)) & "\n");
END Ethiopian.</langsyntaxhighlight>
 
=={{header|MUMPS}}==<lang MUMPS>
<syntaxhighlight lang="mumps">
HALVE(I)
;I should be an integer
Line 3,471 ⟶ 4,035:
Write !,?W,$Justify(A,W),!
Kill W,A,E,L
Q</langsyntaxhighlight>{{out}}
USER>D E2^ROSETTA(1439,7)
Multiplying two numbers:
Line 3,489 ⟶ 4,053:
 
=={{header|Nemerle}}==
<langsyntaxhighlight Nemerlelang="nemerle">using System;
using System.Console;
 
Line 3,515 ⟶ 4,079:
WriteLine("By Ethiopian multiplication, 17 * 34 = {0}", Multiply(17, 34));
}
}</langsyntaxhighlight>
 
=={{header|NetRexx}}==
{{trans|REXX}}
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols nobinary
 
Line 3,549 ⟶ 4,113:
 
method iseven(x) private static
return x//2 == 0</langsyntaxhighlight>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc halve(x: int): int = x div 2
proc double(x: int): int = x * 2
proc odd(x: int): bool = x mod 2 != 0
Line 3,566 ⟶ 4,130:
y = double y
echo ethiopian(17, 34)</langsyntaxhighlight>
 
{{out}}
Line 3,572 ⟶ 4,136:
 
=={{header|Objeck}}==
{{trans|Java}}<langsyntaxhighlight lang="objeck">
use Collection;
 
Line 3,613 ⟶ 4,177:
return (num and 1) = 0;
}
}</langsyntaxhighlight>
 
=={{header|Object Pascal}}==
multiplication.pas:<langsyntaxhighlight lang="pascal">unit Multiplication;
interface
 
Line 3,652 ⟶ 4,216:
end;
begin
end.</langsyntaxhighlight>ethiopianmultiplication.pas:<syntaxhighlight lang ="pascal">program EthiopianMultiplication;
 
uses
Line 3,659 ⟶ 4,223:
begin
WriteLn('17 * 34 = ', Ethiopian(17, 34))
end.</langsyntaxhighlight>{{out}}
17 * 34 = 578
 
=={{header|Objective-C}}==
Using class methods except for the generic useful function <tt>iseven</tt>.
<langsyntaxhighlight lang="objc">#import <stdio.h>
 
BOOL iseven(int x)
Line 3,706 ⟶ 4,270:
}
return 0;
}</langsyntaxhighlight>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">(* We optimize a bit by not keeping the intermediate lists, and summing
the right column on-the-fly, like in the C version.
The function takes "halve" and "double" operators and "is_even" predicate as arguments,
Line 3,766 ⟶ 4,330:
of values in the right column in the original algorithm. But the "add"
me do something else, see for example the RosettaCode page on
"Exponentiation operator". *)</langsyntaxhighlight>
 
=={{header|Octave}}==
<langsyntaxhighlight lang="octave">function r = halve(a)
r = floor(a/2);
endfunction
Line 3,802 ⟶ 4,366:
endfunction
 
disp(ethiopicmult(17, 34, true))</langsyntaxhighlight>
 
=={{header|Oforth}}==
Line 3,810 ⟶ 4,374:
isEven is already defined for Integers.
 
<langsyntaxhighlight Oforthlang="oforth">: halve 2 / ;
: double 2 * ;
Line 3,816 ⟶ 4,380:
dup ifZero: [ nip return ]
over double over halve ethiopian
swap isEven ifTrue: [ nip ] else: [ + ] ;</langsyntaxhighlight>
 
{{out}}
Line 3,826 ⟶ 4,390:
=={{header|Ol}}==
 
<syntaxhighlight lang="ol">
<lang ol>
(define (ethiopian-multiplication l r)
(let ((even? (lambda (n)
Line 3,840 ⟶ 4,404:
 
(print (ethiopian-multiplication 17 34))
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,857 ⟶ 4,421:
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">declare
fun {Halve X} X div 2 end
fun {Double X} X * 2 end
Line 3,884 ⟶ 4,448:
fun {Sum Xs} {FoldL Xs Number.'+' 0} end
in
{Show {EthiopicMult 17 34}}</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">halve(n)=n\2;
double(n)=2*n;
even(n)=!(n%2);
Line 3,897 ⟶ 4,461:
b=double(b));
d
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">program EthiopianMultiplication;
{$IFDEF FPC}
{$MODE DELPHI}
Line 3,933 ⟶ 4,497:
begin
Write(Ethiopian(17, 34))
end.</langsyntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use strict;
 
sub halve { int((shift) / 2); }
Line 3,959 ⟶ 4,523:
}
 
print ethiopicmult(17,34, 1), "\n";</langsyntaxhighlight>
 
=={{header|Phix}}==
{{Trans|Euphoria}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">emHalf</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">/</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span>
Line 3,987 ⟶ 4,551:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"emMultiply(%d,%d) = %d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">17</span><span style="color: #0000FF;">,</span><span style="color: #000000;">34</span><span style="color: #0000FF;">,</span><span style="color: #000000;">emMultiply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">17</span><span style="color: #0000FF;">,</span><span style="color: #000000;">34</span><span style="color: #0000FF;">)})</span>
<!--</langsyntaxhighlight>-->
 
=={{header|PHP}}==
Not object oriented version:<langsyntaxhighlight lang="php"><?php
function halve($x)
{
Line 4,022 ⟶ 4,586:
echo ethiopicmult(17, 34, true), "\n";
 
?></langsyntaxhighlight>{{out}}
ethiopic multiplication of 17 and 34
17, 34 kept
Line 4,031 ⟶ 4,595:
578
Object Oriented version:
{{works with|PHP5}}<langsyntaxhighlight lang="php"><?php
 
class ethiopian_multiply {
Line 4,075 ⟶ 4,639:
 
echo ethiopian_multiply::init(17, 34);
?></langsyntaxhighlight>
 
=={{header|Picat}}==
===Iterative===
<syntaxhighlight lang="picat">ethiopian(Multiplier, Multiplicand) = ethiopian(Multiplier, Multiplicand,false).
 
ethiopian(Multiplier, Multiplicand,Tutor) = Result =>
if Tutor then
printf("\n%d * %d:\n",Multiplier, Multiplicand)
end,
Result1 = 0,
while (Multiplier >= 1)
OldResult = Result1,
if not even(Multiplier) then
Result1 := Result1 + Multiplicand
end,
if Tutor then
printf("%6d % 8s\n",Multiplier,cond(OldResult=Result1,"--",Multiplicand.to_string()))
end,
Multiplier := halve(Multiplier),
Multiplicand := double(Multiplicand)
end,
if Tutor then
println(" ======="),
printf(" %8s\n",Result1.to_string()),
nl
end,
Result = Result1.</syntaxhighlight>
 
===Recursion===
{{trans|Prolog}}
<syntaxhighlight lang="picat">ethiopian2(First,Second,Product) =>
ethiopian2(First,Second,0,Product).
 
ethiopian2(1,Second,Sum0,Sum) =>
Sum = Sum0 + Second.
ethiopian2(First,Second,Sum0,Sum) =>
Sum1 = Sum0 + Second*(First mod 2),
ethiopian2(halve(First), double(Second), Sum1, Sum).
 
halve(X) = X div 2.
double(X) = 2*X.
is_even(X) => X mod 2 = 0.</syntaxhighlight>
 
===Test===
<syntaxhighlight lang="picat">go =>
 
println(ethiopian(17,34)),
 
ethiopian2(17,34,Z2),
println(Z2),
println(ethiopian(17,34,true)),
 
_ = random2(),
_ = ethiopian(random() mod 10000,random() mod 10000,true),
 
nl.</syntaxhighlight>
 
{{out}}
<pre>578
578
 
17 * 34:
17 34
8 --
4 --
2 --
1 544
=======
578
 
578
 
5516 * 9839:
5516 --
2758 --
1379 39356
689 78712
344 --
172 --
86 --
43 1259392
21 2518784
10 --
5 10075136
2 --
1 40300544
=======
54271924</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de halve (N)
(/ N 2) )
 
Line 4,094 ⟶ 4,747:
X (halve X)
Y (double Y) ) )
R ) )</langsyntaxhighlight>
 
=={{header|Pike}}==
<langsyntaxhighlight Pikelang="pike">int ethopian_multiply(int l, int r)
{
int halve(int n) { return n/2; };
Line 4,114 ⟶ 4,767:
while(l);
return product;
}</langsyntaxhighlight>
 
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
<lang PL/I>
declare (L(30), R(30)) fixed binary;
declare (i, s) fixed binary;
Line 4,146 ⟶ 4,799:
odd: procedure (k) returns (bit (1));
return (iand(k, 1) ^= 0);
end odd;</langsyntaxhighlight>
 
=={{header|PL/M}}==
{{Trans|Action!}}
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
<syntaxhighlight lang="plm">
100H: /* ETHIOPIAN MULTIPLICATION */
 
 
/* CP/M SYSTEM CALL AND I/O ROUTINES */
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
PR$NUMBER: PROCEDURE( N ); /* PRINTS A NUMBER IN THE MINIMUN FIELD WIDTH */
DECLARE N ADDRESS;
DECLARE V ADDRESS, N$STR ( 6 )BYTE, W BYTE;
V = N;
W = LAST( N$STR );
N$STR( W ) = '$';
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
DO WHILE( ( V := V / 10 ) > 0 );
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
END;
CALL PR$STRING( .N$STR( W ) );
END PR$NUMBER;
 
/* RETURNS THE RESULT OF A * B USING ETHOPIAN MULTIPLICATION */
ETHIOPIAN$MULTIPLICATION: PROCEDURE( A, B )ADDRESS;
DECLARE ( A, B ) ADDRESS;
DECLARE RES ADDRESS;
 
CALL PR$STRING( .'ETHIOPIAN MULTIPLICATION OF $' );
CALL PR$NUMBER( A );
CALL PR$STRING( .' BY $' );
CALL PR$NUMBER( B );
CALL PR$NL;
 
RES = 0;
DO WHILE A >= 1;
CALL PR$NUMBER( A );
CALL PR$CHAR( ' ' );
CALL PR$NUMBER( B );
IF A MOD 2 = 0 THEN DO;
CALL PR$STRING( .' STRIKE$' );
END;
ELSE DO;
CALL PR$STRING( .' KEEP$' );
RES = RES + B;
END;
CALL PR$NL;
A = SHR( A, 1 );
B = SHL( B, 1 );
END;
RETURN( RES );
END ETHIOPIAN$MULTIPLICATION;
 
DECLARE RES ADDRESS;
 
RES = ETHIOPIAN$MULTIPLICATION( 17, 34 );
CALL PR$STRING( .'RESULT IS $' );
CALL PR$NUMBER( RES );
 
EOF
</syntaxhighlight>
{{out}}
<pre>
ETHIOPIAN MULTIPLICATION OF 17 BY 34
17 34 KEEP
8 68 STRIKE
4 136 STRIKE
2 272 STRIKE
1 544 KEEP
RESULT IS 578
</pre>
 
=={{header|PL/SQL}}==
This code was taken from the ADA example above - very minor differences.
<langsyntaxhighlight lang="plsql">create or replace package ethiopian is
 
function multiply
Line 4,207 ⟶ 4,934:
dbms_output.put_line(ethiopian.multiply(17, 34));
end;
/</langsyntaxhighlight>
 
=={{header|Plain English}}==
<langsyntaxhighlight lang="plainenglish">\All required helper routines already exist in Plain English:
\
\To cut a number in half:
Line 4,241 ⟶ 4,968:
Double the other number.
Repeat.
Put the sum into the number.</langsyntaxhighlight>
{{out}}
<pre>
Line 4,248 ⟶ 4,975:
 
=={{header|Powerbuilder}}==
<langsyntaxhighlight lang="powerbuilder">public function boolean wf_iseven (long al_arg);return mod(al_arg, 2 ) = 0
end function
 
Line 4,275 ⟶ 5,002:
// example call
long ll_answer
ll_answer = wf_ethiopianmultiplication(17,34)</langsyntaxhighlight>
 
=={{header|PowerShell}}==
===Traditional===
<langsyntaxhighlight PowerShelllang="powershell">function isEven {
param ([int]$value)
return [bool]($value % 2 -eq 0)
Line 4,313 ⟶ 5,040:
}
 
multiplyValues 17 34</langsyntaxhighlight>
===Pipes with Busywork===
This uses several PowerShell specific features, in functions everything is returned automatically, so explicitly stating return is unnecessary. type conversion happens automatically for certain types, [int] into [boolean] maps 0 to false and everything else to true. A hash is used to store the values as they are being written, then a pipeline is used to iterate over the keys of the hash, determine which are odd, and only sum those. The three-valued ForEach-Object is used to set a start expression, an iterative expression, and a return expression.
<langsyntaxhighlight PowerShelllang="powershell">function halveInt( [int] $rhs )
{
[math]::floor( $rhs / 2 )
Line 4,344 ⟶ 5,071:
}
 
Ethiopian 17 34</langsyntaxhighlight>
 
=={{header|Prolog}}==
Line 4,350 ⟶ 5,077:
=== Traditional ===
 
<langsyntaxhighlight lang="prolog">halve(X,Y) :- Y is X // 2.
double(X,Y) :- Y is 2*X.
is_even(X) :- 0 is X mod 2.
Line 4,372 ⟶ 5,099:
columns(First,Second,Left,Right),
maplist(contribution,Left,Right,Contributions),
sumlist(Contributions,Product).</langsyntaxhighlight>
 
 
Line 4,379 ⟶ 5,106:
Using the same definitions as above for "halve/2", "double/2" and "is_even/2" along with an SWI-Prolog [http://www.swi-prolog.org/pack/list?p=func pack for function notation], one might write the following solution
 
<langsyntaxhighlight lang="prolog">:- use_module(library(func)).
 
% halve/2, double/2, is_even/2 definitions go here
Line 4,390 ⟶ 5,117:
ethiopian(First,Second,Sum0,Sum) :-
Sum1 is Sum0 + Second*(First mod 2),
ethiopian(halve $ First, double $ Second, Sum1, Sum).</langsyntaxhighlight>
 
 
Line 4,396 ⟶ 5,123:
 
This is a CHR solution for this problem using Prolog as the host language. Code will work in SWI-Prolog and YAP (and possibly in others with or without some minor tweaking).
<langsyntaxhighlight lang="prolog">:- module(ethiopia, [test/0, mul/3]).
 
:- use_module(library(chr)).
Line 4,420 ⟶ 5,147:
test :-
mul(17, 34, Z), !,
writeln(Z).</langsyntaxhighlight>Note that the task statement is what makes the halve and double constraints required. Their use is highly artificial and a more realistic implementation would look like this:
 
<langsyntaxhighlight lang="prolog">:- module(ethiopia, [test/0, mul/3]).
 
:- use_module(library(chr)).
Line 4,442 ⟶ 5,169:
test :-
mul(17, 34, Z),
writeln(Z).</langsyntaxhighlight>Even this is more verbose than what a more native solution would look like.
 
=={{header|Python}}==
===Python: With tutor===
<langsyntaxhighlight lang="python">tutor = True
 
def halve(x):
Line 4,476 ⟶ 5,203:
if tutor:
print()
return result</langsyntaxhighlight>
 
Sample output
Line 4,495 ⟶ 5,222:
Without the tutorial code, and taking advantage of Python's lambda:
 
<langsyntaxhighlight lang="python">halve = lambda x: x // 2
double = lambda x: x*2
even = lambda x: not x % 2
Line 4,508 ⟶ 5,235:
multiplicand = double(multiplicand)
 
return result</langsyntaxhighlight>
 
===Python: With tutor. More Functional===
Using some features which Python has for use in functional programming. The example also tries to show how to mix different programming styles while keeping close to the task specification, a kind of "executable pseudocode". Note: While column2 could theoretically generate a sequence of infinite length, izip will stop requesting values from it (and so provide the necessary stop condition) when column1 has no more values. When not using the tutor, table will generate the table on the fly in an efficient way, not keeping any intermediate values.<langsyntaxhighlight lang="python">tutor = True
 
from itertools import izip, takewhile
Line 4,552 ⟶ 5,279:
if tutor:
show_result(result)
return result</langsyntaxhighlight>{{out|Example output}}
>>> ethiopian(17, 34)
Multiplying 17 by 34 using Ethiopian multiplication:
Line 4,571 ⟶ 5,298:
 
Avoiding the use of the multiplication operator, and defining a catamorphism applied over an anamorphism.
<langsyntaxhighlight lang="python">'''Ethiopian multiplication'''
 
from functools import reduce
Line 4,678 ⟶ 5,405:
if __name__ == '__main__':
main()
</syntaxhighlight>
</lang>
{{Out}}
<pre>halve: (8, 1)
Line 4,714 ⟶ 5,441:
Extended to handle negative numbers.
 
<langsyntaxhighlight Quackerylang="quackery">[ 1 & not ] is even ( n --> b )
 
[ 1 << ] is double ( n --> n )
Line 4,726 ⟶ 5,453:
swap even
iff nip else + ]
swap if negate ] is e* ( n n --> n )</langsyntaxhighlight>
 
=={{header|R}}==
===R: With tutor===
<langsyntaxhighlight Rlang="r">halve <- function(a) floor(a/2)
double <- function(a) a*2
iseven <- function(a) (a%%2)==0
Line 4,748 ⟶ 5,475:
}
 
print(ethiopicmult(17, 34, TRUE))</langsyntaxhighlight>
 
===R: Without tutor===
Simplified version.
<syntaxhighlight lang="r">
<lang R>
halve <- function(a) floor(a/2)
double <- function(a) a*2
Line 4,768 ⟶ 5,495:
 
print(ethiopicmult(17,34))
</syntaxhighlight>
</lang>
 
=={{header|Racket}}==
<langsyntaxhighlight Racketlang="racket">#lang racket
 
(define (halve i) (quotient i 2))
Line 4,782 ⟶ 5,509:
[else (+ y (ethiopian-multiply (halve x) (double y)))]))
 
(ethiopian-multiply 17 34) ; -> 578</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" perl6line>sub halve (Int $n is rw) { $n div= 2 }
sub double (Int $n is rw) { $n *= 2 }
sub even (Int $n --> Bool) { $n %% 2 }
Line 4,800 ⟶ 5,527:
}
 
say ethiopic-mult(17,34);</langsyntaxhighlight>
{{out}}
578
More succinctly using implicit typing, primed lambdas, and an infinite loop:
<syntaxhighlight lang="raku" perl6line>sub ethiopic-mult {
my &halve = * div= 2;
my &double = * *= 2;
Line 4,818 ⟶ 5,545:
}
 
say ethiopic-mult(17,34);</langsyntaxhighlight>
More succinctly still, using a pure functional approach (reductions, mappings, lazy infinite sequences):
<syntaxhighlight lang="raku" perl6line>sub halve { $^n div 2 }
sub double { $^n * 2 }
sub even { $^n %% 2 }
Line 4,830 ⟶ 5,557:
}
 
say ethiopic-mult(17,34);</langsyntaxhighlight>(same output)
 
=={{header|Rascal}}==
<langsyntaxhighlight Rascallang="rascal">import IO;
 
public int halve(int n) = n/2;
Line 4,850 ⟶ 5,577:
}
return result;
} </langsyntaxhighlight>
 
=={{header|Red}}==
<langsyntaxhighlight lang="rebol">Red["Ethiopian multiplication"]
 
halve: function [n][n >> 1]
Line 4,873 ⟶ 5,600:
]
 
print ethiopian-multiply 17 34</langsyntaxhighlight>
{{out}}
<pre>
Line 4,880 ⟶ 5,607:
 
=={{header|Relation}}==
<syntaxhighlight lang="relation">
<lang Relation>
function half(x)
set result = floor(x/2)
Line 4,906 ⟶ 5,633:
run ethiopian_mul(17,34)
print
</syntaxhighlight>
</lang>
 
=={{header|REXX}}==
These two REXX versions properly handle negative integers.
===sans error checking===
<langsyntaxhighlight lang="rexx">/*REXX program multiplies two integers by the Ethiopian (or Russian peasant) method. */
numeric digits 3000 /*handle some gihugeic integers. */
parse arg a b . /*get two numbers from the command line*/
Line 4,930 ⟶ 5,657:
double: return arg(1) * 2 /* * is REXX's multiplication. */
halve: return arg(1) % 2 /* % " " integer division. */
isEven: return arg(1) // 2 == 0 /* // " " division remainder.*/</langsyntaxhighlight>
'''output''' &nbsp; when the following input is used: &nbsp; <tt> 30 &nbsp; -7 </tt>
<pre>
Line 4,942 ⟶ 5,669:
 
Note that the 2<sup>nd</sup> number needn't be an integer, any valid number will work.
<langsyntaxhighlight lang="rexx">/*REXX program multiplies two integers by the Ethiopian (or Russian peasant) method. */
numeric digits 3000 /*handle some gihugeic integers. */
parse arg a b _ . /*get two numbers from the command line*/
Line 4,969 ⟶ 5,696:
halve: return arg(1) % 2 /* % " " integer division. */
isEven: return arg(1) // 2 == 0 /* // " " division remainder.*/
error: say '***error!***' arg(1); exit 13 /*display an error message to terminal.*/</langsyntaxhighlight>
'''output''' &nbsp; when the following input is used: &nbsp; <tt> 200 &nbsp; 0.333 </tt>
<pre>
Line 4,978 ⟶ 5,705:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
x = 17
y = 34
Line 4,997 ⟶ 5,724:
func halve n return floor(n / 2)
func even n return ((n & 1) = 0)
</syntaxhighlight>
</lang>
Output:
<pre>
Line 5,008 ⟶ 5,735:
578
</pre>
 
=={{header|RPL}}==
Calculations are here made on binary integers, on which built-in instructions <code>SL</code> and <code>SR</code> perform resp. doubling and halving.
{{works with|Halcyon Calc|4.2.7}}
{| class="wikitable"
! RPL code
! Comment
|-
|
≪ # 1d AND # 0d ==
≫ ''''EVEN?'''' STO
# 0d ROT R→B ROT R→B
'''WHILE''' OVER # 0d ≠ '''REPEAT'''
'''IF''' OVER '''EVEN?''' NOT
'''THEN''' ROT OVER + ROT ROT '''END '''
SL SWAP SR SWAP
'''END''' DROP2 B→R
≫ ''''ETMUL'''' STO
|
'''EVEN?''' ''( #n -- boolean ) ''
return 1 if n is even, 0 otherwise
'''ETMUL''' ''( a b -- a*b ) ''
put accumulator, a and b (converted to integers) in stack
while b > 0
if b is odd
add a to accumulator
double a, halve b
delete a and b and convert a*b to floating point
|}
 
=={{header|Ruby}}==
Iterative and recursive implementations here.
I've chosen to highlight the example 20*5 which I think is more illustrative.
<syntaxhighlight lang ="ruby">def halve(x) = x/2 end
def double(x) = x*2 end
 
# iterative
Line 5,036 ⟶ 5,796:
$DEBUG = true # $DEBUG also set to true if "-d" option given
a, b = 20, 5
puts "#{a} * #{b} = #{ethiopian_multiply(a,b)}"; puts</langsyntaxhighlight>
 
{{out}}
Line 5,048 ⟶ 5,808:
 
A test suite:
<langsyntaxhighlight lang="ruby">require 'test/unit'
class EthiopianTests < Test::Unit::TestCase
def test_iter1; assert_equal(578, ethopian_multiply(17,34)); end
Line 5,062 ⟶ 5,822:
def test_rec5; assert_equal(0, rec_ethopian_multiply(5,0)); end
def test_rec6; assert_equal(0, rec_ethopian_multiply(0,5)); end
end</langsyntaxhighlight>
<pre>Run options:
 
Line 5,076 ⟶ 5,836:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">fn double(a: i32) -> i32 {
2*a
}
Line 5,110 ⟶ 5,870:
println!("---------------------------------");
println!("\t {}", output);
}</langsyntaxhighlight>
 
{{out}}
Line 5,122 ⟶ 5,882:
 
=={{header|S-BASIC}}==
<langsyntaxhighlight lang="basic">
$constant true = 0FFFFH
$constant false = 0
Line 5,167 ⟶ 5,927:
print ethiopian(17,34,true)
 
end</langsyntaxhighlight>
{{out}}
<pre>Multiplying 17 times 34
Line 5,183 ⟶ 5,943:
The fourth uses recursion.
 
<langsyntaxhighlight lang="scala">
def ethiopian(i:Int, j:Int):Int=
pairIterator(i,j).filter(x=> !isEven(x._1)).map(x=>x._2).foldLeft(0){(x,y)=>x+y}
Line 5,210 ⟶ 5,970:
def next={val r=i; i=(halve(i._1), double(i._2)); r}
}
</syntaxhighlight>
</lang>
 
=={{header|Scheme}}==
In Scheme, <code>even?</code> is a standard procedure.
<langsyntaxhighlight lang="scheme">(define (halve num)
(quotient num 2))
 
Line 5,229 ⟶ 5,989:
 
(display (mul-eth 17 34))
(newline)</langsyntaxhighlight>
Output:
578
Line 5,236 ⟶ 5,996:
Ethiopian Multiplication is another name for the peasant multiplication:
 
<langsyntaxhighlight lang="seed7">const proc: double (inout integer: a) is func
begin
a *:= 2;
Line 5,260 ⟶ 6,020:
double(b);
end while;
end func;</langsyntaxhighlight>
 
Original source (without separate functions for doubling, halving, and checking if a number is even): [http://seed7.sourceforge.net/algorith/math.htm#peasantMult]
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func double (n) { n << 1 }
func halve (n) { n >> 1 }
func isEven (n) { n&1 == 0 }
Line 5,279 ⟶ 6,039:
}
 
say ethiopian_mult(17, 34)</langsyntaxhighlight>
{{out}}
<pre>
Line 5,287 ⟶ 6,047:
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
<langsyntaxhighlight lang="smalltalk">Number extend [
double [ ^ self * 2 ]
halve [ ^ self // 2 ]
Line 5,318 ⟶ 6,078:
]
ethiopianMultiplyBy: aNumber [ ^ self ethiopianMultiplyBy: aNumber withTutor: false ]
].</langsyntaxhighlight>
 
<langsyntaxhighlight lang="smalltalk">(17 ethiopianMultiplyBy: 34 withTutor: true) displayNl.</langsyntaxhighlight>
 
=={{header|SNOBOL4}}==
<langsyntaxhighlight lang="snobol4">
define('halve(num)') :(halve_end)
halve eq(num,1) :s(freturn)
Line 5,344 ⟶ 6,104:
l = halve(l) :s(next)
stop output = s
end</langsyntaxhighlight>
 
=={{header|SNUSP}}==
 
<langsyntaxhighlight lang="snusp"> /==!/==atoi==@@@-@-----#
| | /-\ /recurse\ #/?\ zero
$>,@/>,@/?\<=zero=!\?/<=print==!\@\>?!\@/<@\.!\-/
Line 5,358 ⟶ 6,118:
\>+<-/ | \=<<<!/====?\=\ | double
! # | \<++>-/ | |
\=======\!@>============/!/</langsyntaxhighlight>
 
This is possibly the smallest multiply routine so far discovered for SNUSP.
 
=={{header|Soar}}==
<langsyntaxhighlight lang="soar">##########################################
# multiply takes ^left and ^right numbers
# and a ^return-to
Line 5,426 ⟶ 6,186:
^answer <a>)
-->
(<r> ^multiply-done <a>)}</langsyntaxhighlight>
 
=={{header|Swift}}==
<langsyntaxhighlight lang="swift">import Darwin
 
func ethiopian(var #int1:Int, var #int2:Int) -> Int {
Line 5,454 ⟶ 6,214:
}
 
println(ethiopian(int1: 17, int2: 34))</langsyntaxhighlight>
{{out}}
<pre>578</pre>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl"># This is how to declare functions - the mathematical entities - as opposed to procedures
proc function {name arguments body} {
uplevel 1 [list proc tcl::mathfunc::$name $arguments [list expr $body]]
Line 5,488 ⟶ 6,248:
}
return [expr {mult($a,$b)}]
}</langsyntaxhighlight>Demo code:<langsyntaxhighlight lang="tcl">puts "17 * 34 = [ethiopianMultiply 17 34 true]"</langsyntaxhighlight>{{out}}
Ethiopian multiplication of 17 and 34
17 34 KEPT
Line 5,498 ⟶ 6,258:
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
ASK "insert number1", nr1=""
Line 5,544 ⟶ 6,304:
PRINT line
PRINT sum
</langsyntaxhighlight>{{out}}
ethopian multiplication of 17 and 34
17 34 kept
Line 5,553 ⟶ 6,313:
====================
578
 
== {{header|TypeScript}} ==
{{trans|Modula-2}}
<syntaxhighlight lang="javascript">
// Ethiopian multiplication
function double(a: number): number {
return 2 * a;
}
function halve(a: number): number {
return Math.floor(a / 2);
}
function isEven(a: number): bool {
return a % 2 == 0;
}
function showEthiopianMultiplication(x: number, y: number): void {
var tot = 0;
while (x >= 1) {
process.stdout.write(x.toString().padStart(9, ' ') + " ");
if (!isEven(x)) {
tot += y;
process.stdout.write(y.toString().padStart(9, ' '));
}
console.log();
x = halve(x);
y = double(y);
}
console.log("=" + " ".repeat(9) + tot.toString().padStart(9, ' '));
}
showEthiopianMultiplication(17, 34);
</syntaxhighlight>
{{out}}
<pre>
17 34
8
4
2
1 544
= 578
</pre>
 
=={{header|UNIX Shell}}==
Line 5,558 ⟶ 6,362:
 
{{works with|Bourne Shell}}
<langsyntaxhighlight lang="bash">halve()
{
expr "$1" / 2
Line 5,587 ⟶ 6,391:
 
ethiopicmult 17 34
# => 578</langsyntaxhighlight>
 
While breaking if the --posix flag is passed to bash, the following alternative script avoids the *, /, and % operators. It also uses local variables and built-in arithmetic.
Line 5,595 ⟶ 6,399:
{{works with|zsh}}
 
<langsyntaxhighlight lang="bash">halve() {
(( $1 >>= 1 ))
}
Line 5,622 ⟶ 6,426:
 
multiply 17 34
# => 578</langsyntaxhighlight>
 
==={{header|C Shell}}===
<langsyntaxhighlight lang="csh">alias halve '@ \!:1 /= 2'
alias double '@ \!:1 *= 2'
alias is_even '@ \!:1 = ! ( \!:2 % 2 )'
Line 5,646 ⟶ 6,450:
multiply p 17 34
echo $p
# => 578</langsyntaxhighlight>
 
=={{header|Ursala}}==
Line 5,652 ⟶ 6,456:
check the parity, double a given natural number, or perform truncating division by two. These
functions are normally imported from the nat library but defined here explicitly for
the sake of completeness.<langsyntaxhighlight Ursalalang="ursala">odd = ~&ihB
double = ~&iNiCB
half = ~&itB</langsyntaxhighlight>The functions above are defined in terms of bit manipulations exploiting the concrete representations of natural numbers. The remaining code treats natural numbers instead as abstract types by way of the library API, and uses the operators for distribution (*-), triangular iteration (|\),
and filtering (*~) among others.<langsyntaxhighlight Ursalalang="ursala">#import nat
 
emul = sum:-0@rS+ odd@l*~+ ^|(~&,double)|\+ *-^|\~& @iNC ~&h~=0->tx :^/half@h ~&</langsyntaxhighlight>test program:<syntaxhighlight lang Ursala="ursala">#cast %n
 
test = emul(34,17)</langsyntaxhighlight>{{out}}
578
 
Line 5,667 ⟶ 6,471:
# one to '''double an integer''', and
# one to '''state if an integer is even'''.
<langsyntaxhighlight lang="vb">Private Function lngHalve(Nb As Long) As Long
lngHalve = Nb / 2
End Function
Line 5,677 ⟶ 6,481:
Private Function IsEven(Nb As Long) As Boolean
IsEven = (Nb Mod 2 = 0)
End Function</langsyntaxhighlight>
Use these functions to create a function that does Ethiopian multiplication.
The first function below is a non optimized function :
<langsyntaxhighlight lang="vb">Private Function Ethiopian_Multiplication_Non_Optimized(First As Long, Second As Long) As Long
Dim Left_Hand_Column As New Collection, Right_Hand_Column As New Collection, i As Long, temp As Long
 
Line 5,709 ⟶ 6,513:
Next
Ethiopian_Multiplication_Non_Optimized = temp
End Function</langsyntaxhighlight>
This one is better :
<langsyntaxhighlight lang="vb">Private Function Ethiopian_Multiplication(First As Long, Second As Long) As Long
Do
If Not IsEven(First) Then Mult_Eth = Mult_Eth + Second
Line 5,718 ⟶ 6,522:
Loop While First >= 1
Ethiopian_Multiplication = Mult_Eth
End Function</langsyntaxhighlight>
Then you can call one of these functions like this :
<langsyntaxhighlight lang="vb">Sub Main_Ethiopian()
Dim result As Long
result = Ethiopian_Multiplication(17, 34)
Line 5,726 ⟶ 6,530:
'result = Ethiopian_Multiplication_Non_Optimized(17, 34)
Debug.Print result
End Sub</langsyntaxhighlight>
 
=={{header|VBScript}}==
Line 5,735 ⟶ 6,539:
<code>option explicit</code> makes sure that all variables are declared.
'''Implementation'''<langsyntaxhighlight lang="vb">option explicit
 
class List
Line 5,824 ⟶ 6,628:
multiply = total
end function
</langsyntaxhighlight>'''Invocation'''<syntaxhighlight lang ="vb">
wscript.echo multiply(17,34)
</langsyntaxhighlight>{{out}}
578
 
=={{header|V (Vlang)}}==
{{trans|go}}
<syntaxhighlight lang="v (vlang)">fn halve(i int) int { return i/2 }
fn double(i int) int { return i*2 }
fn is_even(i int) bool { return i%2 == 0 }
fn eth_multi(ii int, jj int) int {
mut r := 0
mut i, mut j := ii, jj
for ; i > 0; i, j = halve(i), double(j) {
if !is_even(i) {
r += j
}
}
return r
}
fn main() {
println("17 ethiopian 34 = ${eth_multi(17, 34)}")
}</syntaxhighlight>
{{out}}
<pre>17 ethiopian 34 = 578</pre>
 
=={{header|Wren}}==
<langsyntaxhighlight ecmascriptlang="wren">var halve = Fn.new { |n| (n/2).truncate }
 
var double = Fn.new { |n| n * 2 }
Line 5,847 ⟶ 6,676:
 
System.print("17 x 34 = %(ethiopian.call(17, 34))")
System.print("99 x 99 = %(ethiopian.call(99, 99))")</langsyntaxhighlight>
 
{{out}}
Line 5,857 ⟶ 6,686:
=={{header|x86 Assembly}}==
{{works with|nasm}}, linking with the C standard library and start code.
<langsyntaxhighlight lang="asm"> extern printf
global main
 
Line 5,965 ⟶ 6,794:
db "struck", 0
kepttxt
db "kept", 0</langsyntaxhighlight>
===Smaller version===
Using old style 16 bit registers created in debug
Line 5,978 ⟶ 6,807:
to test if the value is even
 
<langsyntaxhighlight lang="asm">test,01
jz Even
Odd:
Even:</langsyntaxhighlight><syntaxhighlight lang ="asm">;calling program
 
1BDC:0100 6A11 PUSH 11 ;17 Put operands on the stack
Line 6,009 ⟶ 6,838:
1BDC:0128 C3 RET ; return with the result in AX
 
;pretty small, just 24 bytes </langsyntaxhighlight>
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">include c:\cxpl\codes; \intrinsic 'code' declarations
 
func Halve(N); \Return half of N
Line 6,055 ⟶ 6,884:
Product:= EthiopianMul(1234, 5678);
ChOut(0, 9); IntOut(0, Product); CrLf(0);
]</langsyntaxhighlight>{{out}}
<pre>17 34
8 0
Line 6,077 ⟶ 6,906:
--------
7006652</pre>
=={{header|zig}}==
<syntaxhighlight lang="zig">
// programme multiplication ethiopienne
// Ethiopian multiplication
 
const std = @import("std");
const expect = std.testing.expect;
const print = @import("std").debug.print;
 
pub fn main() !void {
const Res = multiEth(17,34);
print("Resultat= {} \n", .{ Res });
}
test "Ethiopian multiplication" {
try expect(multiEth(20, 10) == 200);
try expect(multiEth(101, 101) == 10201);
try expect(multiEth(20, 0) == 0);
try expect(multiEth(0, 71) == 0);
}
 
 
//*****************************
// multiplication
//*****************************
fn multiEth(X: i64, Y: i64) i64 {
var X1=X;
var Y1=Y;
var sum: i64 = 0;
while (X1>=1) {
if ((@mod(X1,2)) == 1)
sum += Y1;
Y1= Y1 * 2;
X1 = @divFloor(X1,2);
}
return sum;
}
 
</syntaxhighlight>
{{Out}}
<pre>
Resultat= 578
</pre>
 
=={{header|zkl}}==
Trying to duplicate the task as stated, using columns.
isEven is a integer method.
<langsyntaxhighlight lang="zkl">fcn ethiopianMultiply(l,r){ // l is a non-negative integer
halve :=fcn(n){ n/2 };
double :=fcn(n){ n+n };
Line 6,088 ⟶ 6,960:
lr.filter(fcn([(l,r)]){ (not l.isEven) }); // strike out even left rows
.reduce(fcn(sum,[(l,r)]){ sum + r },0); // sum right column
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">foreach l,r in ( T(T(17,34),T(34,1),T(34,2),T(34,0)) ){
println(ethiopianMultiply(l,r)," ",ethiopianMultiply(r,l));
}</langsyntaxhighlight>
{{out}}
<pre>
Line 6,101 ⟶ 6,973:
 
=={{header|Z80 Assembly}}==
<langsyntaxhighlight lang="z80"> org &8000
 
ld hl,17
Line 6,214 ⟶ 7,086:
align 8 ;aligns Column_2 to the nearest 256 byte boundary. This makes offsetting easier.
Column_2:
ds 16,0</langsyntaxhighlight>
 
{{out}}
Line 6,224 ⟶ 7,096:
=={{header|ZX Spectrum Basic}}==
{{trans|GW-BASIC}}
<langsyntaxhighlight lang="zxbasic">10 DEF FN e(a)=a-INT (a/2)*2-1
20 DEF FN h(a)=INT (a/2)
30 DEF FN d(a)=2*a
Line 6,233 ⟶ 7,105:
80 PRINT "---"
90 LET x=FN h(x): LET y=FN d(y): GO TO 50
100 PRINT TAB (4);"===",TAB (4);tot</langsyntaxhighlight>
 
[[Category:Arithmetic]]
1,983

edits