From 74cebd4b9be9ac043c6b19d1b095547af020e832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Masip?= Date: Wed, 13 Mar 2024 19:26:04 +0100 Subject: [PATCH] Adding some worst case tests --- test/testArrayArith.zkasm | 1127 +++++++++++++++++++++---------------- test/testModExp.zkasm | 340 +++++------ 2 files changed, 806 insertions(+), 661 deletions(-) diff --git a/test/testArrayArith.zkasm b/test/testArrayArith.zkasm index aad87c4b..2b2e2653 100644 --- a/test/testArrayArith.zkasm +++ b/test/testArrayArith.zkasm @@ -2,7 +2,11 @@ INCLUDE "../main/constants.zkasm" INCLUDE "../main/modexp/constants.zkasm" -CONSTL %ARRAY_BASE_MINUS_ONE = 115792089237316195423570985008687907853269984665640564039457584007913129639935n ; 2^256 +CONSTL %ARRAY_BASE_MINUS_ONE = 115792089237316195423570985008687907853269984665640564039457584007913129639935n ; 2^256-1 +CONSTL %ARRAY_BASE_MINUS_TWO = 115792089237316195423570985008687907853269984665640564039457584007913129639934n ; 2^256-2 +CONSTL %ARRAY_BASE_HALF = 57896044618658097711785492504343953926634992332820282019728792003956564819968n ; 2^255 +CONSTL %ARRAY_BASE_HALF_MINUS_ONE = 57896044618658097711785492504343953926634992332820282019728792003956564819967n ; 2^255-1 +CONST %ARRAY_MAX_LEN_DOUBLED_MINUS_TWO = %ARRAY_MAX_LEN_DOUBLED - 2 CONST %ARRAY_MAX_LEN_DIV_BY_TWO = %ARRAY_MAX_LEN / 2 VAR GLOBAL lastHashKId @@ -50,35 +54,59 @@ start: ; 1] [2**256-1,2**256-1,2**256-1] + [2**256-1,2**256-1] 3 => C 2 => D - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_AGTB_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_AGTB_inA) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_AGTB_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_AGTB_inA + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_AGTB_inA + E) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_AGTB_inB) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_AGTB_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_AGTB_inB) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_AGTB_inB + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_AGTB_inB + E) :CALL(array_add_AGTB) 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_add_AGTB_out) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_add_AGTB_out + E) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_add_AGTB_out + E) 2 => E 0n :MLOAD(array_add_AGTB_out + E) 3 => E 1n :MLOAD(array_add_AGTB_out + E) 4 :MLOAD(array_add_AGTB_len_out) + + ; 2] [2**256-2]*%ARRAY_MAX_LEN_DOUBLED + [1]*%ARRAY_MAX_LEN + %ARRAY_MAX_LEN_DOUBLED => C + %ARRAY_MAX_LEN => D + C - 1 => E + D - 1 => RR + array_add_AGTB_wc_test_inA: + %ARRAY_BASE_MINUS_TWO :MSTORE(array_add_AGTB_inA + E) + E - 1 => E :JMPN(array_add_AGTB_wc_test_inB,array_add_AGTB_wc_test_inA) + array_add_AGTB_wc_test_inB: + 1n :MSTORE(array_add_AGTB_inB + RR) + RR - 1 => RR :JMPN(array_add_AGTB_wc_test_compute,array_add_AGTB_wc_test_inB) + array_add_AGTB_wc_test_compute: + :CALL(array_add_AGTB) + %ARRAY_MAX_LEN_DOUBLED => E :MLOAD(array_add_AGTB_len_out) + E - 1 => E + array_add_AGTB_wc_test_check1: + %ARRAY_BASE_MINUS_TWO :MLOAD(array_add_AGTB_out + E) + E - 1 => E + E - %ARRAY_MAX_LEN :JMPN(array_add_AGTB_wc_test_check2,array_add_AGTB_wc_test_check1) + array_add_AGTB_wc_test_check2: + %ARRAY_BASE_MINUS_ONE :MLOAD(array_add_AGTB_out + E) + E - 1 => E :JMPN(array_add_AGTB_wc_test_end,array_add_AGTB_wc_test_check2) + array_add_AGTB_wc_test_end: ; --------------------------------------------------------------- ; short addition ; --------------------------------------------------------------- ; 1] [2**256-1,2**256-1,2**256-1] + [2**256-1] 3 => C - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_short_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_short_inA) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_short_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_short_inA + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_short_inA + E) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_short_inB) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_short_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_short_inB) :CALL(array_add_short) 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_add_short_out) 1 => E @@ -88,57 +116,101 @@ start: 3 => E 1n :MLOAD(array_add_short_out + E) 4 :MLOAD(array_add_short_len_out) + + ; 2] [2**256-1]*%ARRAY_MAX_LEN + [1] + %ARRAY_MAX_LEN => C + C - 1 => E + array_add_short_wc_test_inA: + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_short_inA + E) + E - 1 => E :JMPN(array_add_short_wc_test_compute,array_add_short_wc_test_inA) + array_add_short_wc_test_compute: + 1n :MSTORE(array_add_short_inB) + :CALL(array_add_short) + %ARRAY_MAX_LEN_PLUS_ONE => E :MLOAD(array_add_short_len_out) + E - 1 => E + 1n :MLOAD(array_add_short_out + E) + E - 1 => E + array_add_short_wc_test_check: + 0n :MLOAD(array_add_short_out + E) + E - 1 => E :JMPN(array_add_short_wc_test_end,array_add_short_wc_test_check) + array_add_short_wc_test_end: ; --------------------------------------------------------------- - ; multiplication + ; long multiplication ; --------------------------------------------------------------- ; 1] len(inB) = len(inA) and inB > inA 3 => C 3 => D - 5n :MSTORE(array_mul_inA) + 5n :MSTORE(array_mul_long_inA) 1 => E - 6n :MSTORE(array_mul_inA + E) + 6n :MSTORE(array_mul_long_inA + E) 2 => E - 7n :MSTORE(array_mul_inA + E) + 7n :MSTORE(array_mul_long_inA + E) - 2n :MSTORE(array_mul_inB) + 2n :MSTORE(array_mul_long_inB) 1 => E - 3n :MSTORE(array_mul_inB + E) + 3n :MSTORE(array_mul_long_inB + E) 2 => E - 4n :MSTORE(array_mul_inB + E) - :CALL(array_mul) - 10n :MLOAD(array_mul_out) + 4n :MSTORE(array_mul_long_inB + E) + :CALL(array_mul_long) + 10n :MLOAD(array_mul_long_out) 1 => E - 27n :MLOAD(array_mul_out + E) + 27n :MLOAD(array_mul_long_out + E) 2 => E - 52n :MLOAD(array_mul_out + E) + 52n :MLOAD(array_mul_long_out + E) 3 => E - 45n :MLOAD(array_mul_out + E) + 45n :MLOAD(array_mul_long_out + E) 4 => E - 28n :MLOAD(array_mul_out + E) - 5 :MLOAD(array_mul_len_out) + 28n :MLOAD(array_mul_long_out + E) + 5 :MLOAD(array_mul_long_len_out) ; 2] len(inB) != len(inA) 2 => C 3 => D - 5n :MSTORE(array_mul_inA) + 5n :MSTORE(array_mul_long_inA) 1 => E - 6n :MSTORE(array_mul_inA + E) + 6n :MSTORE(array_mul_long_inA + E) - 11n :MSTORE(array_mul_inB) + 11n :MSTORE(array_mul_long_inB) 1 => E - 21n :MSTORE(array_mul_inB + E) + 21n :MSTORE(array_mul_long_inB + E) 2 => E - 16n :MSTORE(array_mul_inB + E) - :CALL(array_mul) - 55n :MLOAD(array_mul_out) + 16n :MSTORE(array_mul_long_inB + E) + :CALL(array_mul_long) + 55n :MLOAD(array_mul_long_out) 1 => E - 171n :MLOAD(array_mul_out + E) + 171n :MLOAD(array_mul_long_out + E) 2 => E - 206n :MLOAD(array_mul_out + E) + 206n :MLOAD(array_mul_long_out + E) 3 => E - 96n :MLOAD(array_mul_out + E) - 4 :MLOAD(array_mul_len_out) + 96n :MLOAD(array_mul_long_out + E) + 4 :MLOAD(array_mul_long_len_out) + + ; 3] [2**256-1] || [0]*%ARRAY_MAX_LEN_DOUBLED_MINUS_TWO * [1]*2 + %ARRAY_MAX_LEN_DOUBLED_MINUS_ONE => C + 2 => D + C - 1 => E + D - 1 => RR + %ARRAY_BASE_MINUS_ONE :MSTORE(array_mul_long_inA + E) + E - 1 => E + array_mul_long_wc_test_inA: + 0n :MSTORE(array_mul_long_inA + E) + E - 1 => E :JMPN(array_mul_long_wc_test_inB,array_mul_long_wc_test_inA) + array_mul_long_wc_test_inB: + 1n :MSTORE(array_mul_long_inB + RR) + RR - 1 => RR :JMPN(array_mul_long_wc_test_compute,array_mul_long_wc_test_inB) + array_mul_long_wc_test_compute: + :CALL(array_mul_long) + %ARRAY_MAX_LEN_DOUBLED => E :MLOAD(array_mul_long_len_out) + E - 1 => E + array_mul_long_wc_test_check1: + %ARRAY_BASE_MINUS_ONE :MLOAD(array_mul_long_out + E) + E - 1 => E + E - 62 :JMPN(array_mul_long_wc_test_check2,array_mul_long_wc_test_check1) + array_mul_long_wc_test_check2: + 0n :MLOAD(array_mul_long_out + E) + E - 1 => E :JMPN(array_mul_long_wc_test_end,array_mul_long_wc_test_check2) + array_mul_long_wc_test_end: ; --------------------------------------------------------------- ; short multiplication @@ -146,44 +218,124 @@ start: ; 1] [a, a, a] * a 3 => C 1 => D - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_mul_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_mul_short_inA) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_mul_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_mul_short_inA + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_mul_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_mul_short_inA + E) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_mul_inB) - :CALL(array_mul) - 1n :MLOAD(array_mul_out) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_mul_short_inB) + :CALL(array_mul_short) + 1n :MLOAD(array_mul_short_out) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_mul_out + E) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_mul_short_out + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_mul_out + E) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_mul_short_out + E) 3 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_mul_out + E) - 4 :MLOAD(array_mul_len_out) + 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_mul_short_out + E) + 4 :MLOAD(array_mul_short_len_out) ; 2] [a, 100, a, 6] * 400 4 => C 1 => D - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_mul_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_mul_short_inA) 1 => E - 100n :MSTORE(array_mul_inA + E) + 100n :MSTORE(array_mul_short_inA + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_mul_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_mul_short_inA + E) 3 => E - 6n :MSTORE(array_mul_inA + E) + 6n :MSTORE(array_mul_short_inA + E) - 400n :MSTORE(array_mul_inB) - :CALL(array_mul) - 115792089237316195423570985008687907853269984665640564039457584007913129639536n :MLOAD(array_mul_out) + 400n :MSTORE(array_mul_short_inB) + :CALL(array_mul_short) + 115792089237316195423570985008687907853269984665640564039457584007913129639536n :MLOAD(array_mul_short_out) 1 => E - 40399n :MLOAD(array_mul_out + E) + 40399n :MLOAD(array_mul_short_out + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639536n :MLOAD(array_mul_out + E) + 115792089237316195423570985008687907853269984665640564039457584007913129639536n :MLOAD(array_mul_short_out + E) 3 => E - 2799n :MLOAD(array_mul_out + E) - 4 :MLOAD(array_mul_len_out) + 2799n :MLOAD(array_mul_short_out + E) + 4 :MLOAD(array_mul_short_len_out) + + ; 3] [2**255]*%ARRAY_MAX_LEN * [2] + %ARRAY_MAX_LEN => C + C - 1 => E + array_mul_short_wc_test_inA: + %ARRAY_BASE_HALF :MSTORE(array_mul_short_inA + E) + E - 1 => E :JMPN(array_mul_short_wc_test_compute,array_mul_short_wc_test_inA) + array_mul_short_wc_test_compute: + 2n :MSTORE(array_mul_short_inB) + :CALL(array_mul_short) + %ARRAY_MAX_LEN_PLUS_ONE => E :MLOAD(array_mul_short_len_out) + E - 1 => E + array_mul_short_wc_test_check: + 1n :MLOAD(array_mul_short_out + E) + E - 1 => E :JMPZ(array_mul_short_wc_test_end,array_mul_short_wc_test_check) + array_mul_short_wc_test_end: + 0n :MLOAD(array_mul_short_out + E) + ; --------------------------------------------------------------- + + ; multiplication by two + ; --------------------------------------------------------------- + ; 1] [0n] + 1 => C + 0n :MSTORE(array_mul_two_in) + :CALL(array_mul_two) + 0n :MLOAD(array_mul_two_out) + 1 :MLOAD(array_mul_two_len_out) + + ; 2] [1n] + 1 => C + 1n :MSTORE(array_mul_two_in) + :CALL(array_mul_two) + 2n :MLOAD(array_mul_two_out) + 1 :MLOAD(array_mul_two_len_out) + + ; 3] [4n] + 1 => C + 4n :MSTORE(array_mul_two_in) + :CALL(array_mul_two) + 8n :MLOAD(array_mul_two_out) + 1 :MLOAD(array_mul_two_len_out) + + ; 4] [4n, 4n] + 2 => C + 4n :MSTORE(array_mul_two_in) + 1 => E + 4n :MSTORE(array_mul_two_in + E) + :CALL(array_mul_two) + 8n :MLOAD(array_mul_two_out) + 1 => E + 8n :MLOAD(array_mul_two_out + E) + 2 :MLOAD(array_mul_two_len_out) + + ; 5] [2^255, 2^255] + 2 => C + 57896044618658097711785492504343953926634992332820282019728792003956564819968n :MSTORE(array_mul_two_in) + 1 => E + 57896044618658097711785492504343953926634992332820282019728792003956564819968n :MSTORE(array_mul_two_in + E) + :CALL(array_mul_two) + 0n :MLOAD(array_mul_two_out) + 1 => E + 1n :MLOAD(array_mul_two_out + E) + 2 => E + 1n :MLOAD(array_mul_two_out + E) + 3 :MLOAD(array_mul_two_len_out) + + ; 6] [2^255-1] * %ARRAY_MAX_LEN + %ARRAY_MAX_LEN => C + C - 1 => E + array_mul_two_wc_test: + %ARRAY_BASE_HALF_MINUS_ONE :MSTORE(array_mul_two_in + E) + E - 1 => E :JMPN(array_mul_two_wc_test_compute,array_mul_two_wc_test) + array_mul_two_wc_test_compute: + :CALL(array_mul_two) + %ARRAY_MAX_LEN => E :MLOAD(array_mul_two_len_out) + E - 1 => E + array_mul_two_wc_test_check: + %ARRAY_BASE_MINUS_TWO :MLOAD(array_mul_two_out + E) + E - 1 => E :JMPN(array_mul_two_wc_test_end,array_mul_two_wc_test_check) + array_mul_two_wc_test_end: ; --------------------------------------------------------------- ; squaring @@ -281,7 +433,7 @@ start: ; 5] [ARRAY_BASE-1,ARRAY_BASE/2+1,ARRAY_BASE-2] ; this covers the edge case where the addition 2·a_i·a_j + out[i + j] produces a third chunk carry 3 => C - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_square_in) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_square_in) 1 => E 57896044618658097711785492504343953926634992332820282019728792003956564819969n :MSTORE(array_square_in + E) 2 => E @@ -329,7 +481,7 @@ start: 3 => C 57896044618658097711785492504343953926634992332820282019728792003956564819969n :MSTORE(array_square_in) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_square_in + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_square_in + E) 2 => E 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MSTORE(array_square_in + E) :CALL(array_square) @@ -377,249 +529,63 @@ start: 5 => E 268483n :MLOAD(array_square_out + E) 6 :MLOAD(array_square_len_out) - ; --------------------------------------------------------------- - ; division + ; 9] [2**256-1] || [0]*%ARRAY_MAX_LEN_MINUS_ONE + %ARRAY_MAX_LEN => C + C - 1 => E + %ARRAY_BASE_MINUS_ONE :MSTORE(array_square_in + E) + E - 1 => E + array_square_wc_test_inA: + 0n :MSTORE(array_square_in + E) + E - 1 => E :JMPN(array_square_wc_test_compute,array_square_wc_test_inA) + array_square_wc_test_compute: + :CALL(array_square) + %ARRAY_MAX_LEN_DOUBLED => E :MLOAD(array_square_len_out) + E - 1 => E + %ARRAY_BASE_MINUS_TWO :MLOAD(array_square_out + E) + E - 1 => E + 1n :MLOAD(array_square_out + E) + E - 1 => E + array_square_wc_test_check: + 0n :MLOAD(array_square_out + E) + E - 1 => E :JMPN(array_square_wc_test_end,array_square_wc_test_check) + array_square_wc_test_end: ; --------------------------------------------------------------- - ; 1] [9n, 8n, 7n, 6n] / 8n - 4 => C - 1 => D - 9n :MSTORE(array_div_inA) - 1 => E - 8n :MSTORE(array_div_inA + E) - 2 => E - 7n :MSTORE(array_div_inA + E) - 3 => E - 6n :MSTORE(array_div_inA + E) - - 8n :MSTORE(array_div_inB) - :CALL(array_div) - 1n :MLOAD(array_div_quo) - 1 => E - 101318078082651670995624611882601919371611236582435493534525386006923988434945n :MLOAD(array_div_quo + E) - 2 => E - 86844066927987146567678238756515930889952488499230423029593188005934847229952n :MLOAD(array_div_quo + E) - 1n :MLOAD(array_div_rem) - 3 :MLOAD(array_div_len_quo) - - ; 2] [a, 7n, a, 12n, a, 20n, a, 80n] / a - 8 => C - 1 => D - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA) - 1 => E - 7n :MSTORE(array_div_inA + E) - 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA + E) - 3 => E - 12n :MSTORE(array_div_inA + E) - 4 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA + E) - 5 => E - 20n :MSTORE(array_div_inA + E) - 6 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA + E) - 7 => E - 80n :MSTORE(array_div_inA + E) - - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inB) - :CALL(array_div) - 120n :MLOAD(array_div_quo) - 1 => E - 112n :MLOAD(array_div_quo + E) - 2 => E - 113n :MLOAD(array_div_quo + E) - 3 => E - 100n :MLOAD(array_div_quo + E) - 4 => E - 101n :MLOAD(array_div_quo + E) - 5 => E - 80n :MLOAD(array_div_quo + E) - 6 => E - 81n :MLOAD(array_div_quo + E) - 119n :MLOAD(array_div_rem) - 7 :MLOAD(array_div_len_quo) - - ; 3] inA == 0, inB != 0, len(inB) == 1 - 1 => C - 1 => D - 0n :MSTORE(array_div_inA) - - 8n :MSTORE(array_div_inB) - :CALL(array_div) - 0n :MLOAD(array_div_quo) - 0n :MLOAD(array_div_rem) - 1 :MLOAD(array_div_len_quo) - - 1 => C - 1 => D - 0n :MSTORE(array_div_short_inA) - 8n :MSTORE(array_div_short_inB) - :CALL(array_div_short) - 0n :MLOAD(array_div_short_quo) - 0n :MLOAD(array_div_short_rem) - 1 :MLOAD(array_div_short_len_quo) - - ; 4] inA == 0, inB != 0, len(inB) > 1 - 1 => C - 2 => D - 0n :MSTORE(array_div_inA) - - 8n :MSTORE(array_div_inB) - 1 => E - 1n :MSTORE(array_div_inB + E) - :CALL(array_div) - 0n :MLOAD(array_div_quo) - 0n :MLOAD(array_div_rem) - - - 1 => C - 1 => D - 4n :MSTORE(array_div_short_inA) - 2n :MSTORE(array_div_short_inB) - :CALL(array_div_short) - 2n :MLOAD(array_div_short_quo) - 0n :MLOAD(array_div_short_rem) - 1 :MLOAD(array_div_short_len_quo) + ; long division + ; --------------------------------------------------------------- + ; 1] inA == 0, inB != 0, len(inB) > 1 1 => C 2 => D 0n :MSTORE(array_div_long_inA) 8n :MSTORE(array_div_long_inB) 1 => E - 8n :MSTORE(array_div_long_inB + E) + 1n :MSTORE(array_div_long_inB + E) :CALL(array_div_long) 0n :MLOAD(array_div_long_quo) 0n :MLOAD(array_div_long_rem) 1 :MLOAD(array_div_long_len_quo) + 1 :MLOAD(array_div_long_len_rem) - ; 5] inA != 0, inB == 0 -> error - 1 => C - 1 => D - 8n :MSTORE(array_div_inA) - 0n :MSTORE(array_div_inB) - :CALL(array_div) - 1 => A - B :ASSERT - - 2 => C - 1 => D - 0n :MSTORE(array_div_inA) - 1 => E - 30n :MSTORE(array_div_inA + E) - - 0n :MSTORE(array_div_inB) - :CALL(array_div) - 1 => A - B :ASSERT - - ; 6] inA == inB == 0 -> error - 1 => C - 1 => D - 0n :MSTORE(array_div_inA) - 0n :MSTORE(array_div_inB) - :CALL(array_div) - 1 => A - B :ASSERT - - ; 7] inA == inB - 1 => C - 1 => D - 10n :MSTORE(array_div_inA) - 10n :MSTORE(array_div_inB) - :CALL(array_div) - 1n :MLOAD(array_div_quo) - 0n :MLOAD(array_div_rem) - 1 :MLOAD(array_div_len_quo) - - 2 => C - 2 => D - 10n :MSTORE(array_div_inA) - 1 => E - 30n :MSTORE(array_div_inA + E) - - 10n :MSTORE(array_div_inB) - 1 => E - 30n :MSTORE(array_div_inB + E) - :CALL(array_div) - 1n :MLOAD(array_div_quo) - 0n :MLOAD(array_div_rem) - - 1 => C - 1 => D - 10n :MSTORE(array_div_short_inA) - 10n :MSTORE(array_div_short_inB) - :CALL(array_div_short) - 1n :MLOAD(array_div_short_quo) - 0n :MLOAD(array_div_short_rem) - 1 :MLOAD(array_div_short_len_quo) - - 1 => C - 1 => D - 10n :MSTORE(array_div_short_inA) - 10n :MSTORE(array_div_short_inB) - :CALL(array_div_short) - 1n :MLOAD(array_div_short_quo) - 0n :MLOAD(array_div_short_rem) - 1 :MLOAD(array_div_short_len_quo) - - ; 8] inA = k·inB + ; 2] inA < inB, 1 == len(inA) < len(inB) 1 => C - 1 => D - 4n :MSTORE(array_div_short_inA) - 2n :MSTORE(array_div_short_inB) - :CALL(array_div_short) - 2n :MLOAD(array_div_short_quo) - 0n :MLOAD(array_div_short_rem) - 1 :MLOAD(array_div_short_len_quo) - - 2 => C 2 => D - 4n :MSTORE(array_div_long_inA) - 1 => E - 4n :MSTORE(array_div_long_inA + E) - 2n :MSTORE(array_div_long_inB) + 7n :MSTORE(array_div_long_inA) + 7719472615821079694904732333912527190217998977709370935963838933860875309329n :MSTORE(array_div_long_inB) 1 => E - 2n :MSTORE(array_div_long_inB + E) + 17n :MSTORE(array_div_long_inB + E) :CALL(array_div_long) - 2n :MLOAD(array_div_long_quo) - 0n :MLOAD(array_div_long_rem) + 0n :MLOAD(array_div_long_quo) + 7n :MLOAD(array_div_long_rem) 1 :MLOAD(array_div_long_len_quo) 1 :MLOAD(array_div_long_len_rem) - ; 9] inA < inB - 1 => C - 1 => D - 10n :MSTORE(array_div_inA) - 11n :MSTORE(array_div_inB) - :CALL(array_div) - 0n :MLOAD(array_div_quo) - 10n :MLOAD(array_div_rem) - 1 :MLOAD(array_div_len_quo) - - 1 => C - 1 => D - 10n :MSTORE(array_div_short_inA) - 11n :MSTORE(array_div_short_inB) - :CALL(array_div_short) - 0n :MLOAD(array_div_short_quo) - 10n :MLOAD(array_div_short_rem) - 1 :MLOAD(array_div_short_len_quo) - - 1 => C - 1 => D - 10n :MSTORE(array_div_short_inA) - 11n :MSTORE(array_div_short_inB) - :CALL(array_div_short) - 0n :MLOAD(array_div_short_quo) - 10n :MLOAD(array_div_short_rem) - 1 :MLOAD(array_div_short_len_quo) - + ; 3] inA < inB, 1 < len(inA) < len(inB) 2 => C 3 => D 10n :MSTORE(array_div_long_inA) 1 => E 30n :MSTORE(array_div_long_inA + E) - 6n :MSTORE(array_div_long_inB) 1 => E 7n :MSTORE(array_div_long_inB + E) @@ -633,208 +599,418 @@ start: 1n :MLOAD(array_div_long_len_quo) 2n :MLOAD(array_div_long_len_rem) - ; 10] [28948022309329048855892746252171976963317496166410141009864396001978282409984n, 1n] / 2 + ; 4] inA == inB, len(inA),len(inB) > 1 2 => C - 1 => D - 28948022309329048855892746252171976963317496166410141009864396001978282409984n :MSTORE(array_div_inA) + 2 => D + 10n :MSTORE(array_div_long_inA) 1 => E - 1n :MSTORE(array_div_inA + E) - - 2n :MSTORE(array_div_inB) - :CALL(array_div) - 72370055773322622139731865630429942408293740416025352524660990004945706024960n :MLOAD(array_div_quo) - 1 :MLOAD(array_div_len_quo) + 30n :MSTORE(array_div_long_inA + E) + 10n :MSTORE(array_div_long_inB) + 1 => E + 30n :MSTORE(array_div_long_inB + E) + :CALL(array_div_long) + 1n :MLOAD(array_div_long_quo) + 0n :MLOAD(array_div_long_rem) + 1 :MLOAD(array_div_long_len_quo) + 1 :MLOAD(array_div_long_len_rem) - ; 11] [72370055773322622139731865630429942408293740416025352524660990004945706024960n] / 2 - 1 => C - 1 => D - 72370055773322622139731865630429942408293740416025352524660990004945706024960n :MSTORE(array_div_inA) - 2n :MSTORE(array_div_inB) - :CALL(array_div) - 36185027886661311069865932815214971204146870208012676262330495002472853012480n :MLOAD(array_div_quo) - 1 :MLOAD(array_div_len_quo) + ; 5] inA == k·inB, len(inA),len(inB) > 1 + 2 => C + 2 => D + 4n :MSTORE(array_div_long_inA) + 1 => E + 4n :MSTORE(array_div_long_inA + E) + 2n :MSTORE(array_div_long_inB) + 1 => E + 2n :MSTORE(array_div_long_inB + E) + :CALL(array_div_long) + 2n :MLOAD(array_div_long_quo) + 0n :MLOAD(array_div_long_rem) + 1 :MLOAD(array_div_long_len_quo) + 1 :MLOAD(array_div_long_len_rem) - ; 12] len(inB) = len(inA) and inB > inA + ; 6] inA > inB, len(inA) > len(inB) > 1 4 => C 2 => D - 9n :MSTORE(array_div_inA) + 9n :MSTORE(array_div_long_inA) 1 => E - 8n :MSTORE(array_div_inA + E) + 8n :MSTORE(array_div_long_inA + E) 2 => E - 7n :MSTORE(array_div_inA + E) + 7n :MSTORE(array_div_long_inA + E) 3 => E - 6n :MSTORE(array_div_inA + E) - - 8n :MSTORE(array_div_inB) + 6n :MSTORE(array_div_long_inA + E) + 8n :MSTORE(array_div_long_inB) 1 => E - 1n :MSTORE(array_div_inB + E) - :CALL(array_div) - 335n :MLOAD(array_div_quo) + 1n :MSTORE(array_div_long_inB + E) + :CALL(array_div_long) + 335n :MLOAD(array_div_long_quo) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639895n :MLOAD(array_div_quo + E) + 115792089237316195423570985008687907853269984665640564039457584007913129639895n :MLOAD(array_div_long_quo + E) 2 => E - 5n :MLOAD(array_div_quo + E) - 115792089237316195423570985008687907853269984665640564039457584007913129637265n :MLOAD(array_div_rem) + 5n :MLOAD(array_div_long_quo + E) + 115792089237316195423570985008687907853269984665640564039457584007913129637265n :MLOAD(array_div_long_rem) + 3 :MLOAD(array_div_long_len_quo) + 1 :MLOAD(array_div_long_len_rem) - ; 13] [a, 7n, a, 12n, a, 20n, a, 80n] / [a, a, a, a, 100n] + ; 7] [a, 7n, a, 12n, a, 20n, a, 80n] / [a, a, a, a, 100n] 8 => C 5 => D - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inA) 1 => E - 7n :MSTORE(array_div_inA + E) + 7n :MSTORE(array_div_long_inA + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inA + E) 3 => E - 12n :MSTORE(array_div_inA + E) + 12n :MSTORE(array_div_long_inA + E) 4 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inA + E) 5 => E - 20n :MSTORE(array_div_inA + E) + 20n :MSTORE(array_div_long_inA + E) 6 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inA + E) 7 => E - 80n :MSTORE(array_div_inA + E) - - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inB) + 80n :MSTORE(array_div_long_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inB) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inB + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inB + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inB + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inB + E) 3 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inB + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inB + E) 4 => E - 100n :MSTORE(array_div_inB + E) - :CALL(array_div) - 87130681010257731209815790699606742543054641926620622445532439451498988639951n :MLOAD(array_div_quo) + 100n :MSTORE(array_div_long_inB + E) + :CALL(array_div_long) + 87130681010257731209815790699606742543054641926620622445532439451498988639951n :MLOAD(array_div_long_quo) 1 => E - 76812574048516684092863920748337523031377118540573443471719387411189897879957n :MLOAD(array_div_quo + E) + 76812574048516684092863920748337523031377118540573443471719387411189897879957n :MLOAD(array_div_long_quo + E) 2 => E - 92862962655669424052566829561422975605097710474424610764317468362781816839948n :MLOAD(array_div_quo + E) - 87130681010257731209815790699606742543054641926620622445532439451498988639950n :MLOAD(array_div_rem) + 92862962655669424052566829561422975605097710474424610764317468362781816839948n :MLOAD(array_div_long_quo + E) + 87130681010257731209815790699606742543054641926620622445532439451498988639950n :MLOAD(array_div_long_rem) 1 => E - 76812574048516684092863920748337523031377118540573443471719387411189897879965n :MLOAD(array_div_rem + E) + 76812574048516684092863920748337523031377118540573443471719387411189897879965n :MLOAD(array_div_long_rem + E) 2 => E - 92862962655669424052566829561422975605097710474424610764317468362781816839947n :MLOAD(array_div_rem + E) + 92862962655669424052566829561422975605097710474424610764317468362781816839947n :MLOAD(array_div_long_rem + E) 3 => E - 13n :MLOAD(array_div_rem + E) + 13n :MLOAD(array_div_long_rem + E) 4 => E - 84n :MLOAD(array_div_rem + E) + 84n :MLOAD(array_div_long_rem + E) + 3 :MLOAD(array_div_long_len_quo) + 5 :MLOAD(array_div_long_len_rem) - ; 14] [82987931714326364316120253427931880709278140571418487333162713377057429160720n,4257238595720679277571917967782652353394431698489248379634099239588181418140n,15209178211456919413336795740141505754388379695813905932093982440742677791802n,88987534839350135473536361176867192550264928852523682165693061442019881855583n,14n], [4n, 6n, 7n] + ; 8] [82987931714326364316120253427931880709278140571418487333162713377057429160720n,4257238595720679277571917967782652353394431698489248379634099239588181418140n,15209178211456919413336795740141505754388379695813905932093982440742677791802n,88987534839350135473536361176867192550264928852523682165693061442019881855583n,14n], [4n, 6n, 7n] 5 => C 3 => D - 82987931714326364316120253427931880709278140571418487333162713377057429160720n :MSTORE(array_div_inA) + 82987931714326364316120253427931880709278140571418487333162713377057429160720n :MSTORE(array_div_long_inA) 1 => E - 4257238595720679277571917967782652353394431698489248379634099239588181418140n :MSTORE(array_div_inA + E) + 4257238595720679277571917967782652353394431698489248379634099239588181418140n :MSTORE(array_div_long_inA + E) 2 => E - 15209178211456919413336795740141505754388379695813905932093982440742677791802n :MSTORE(array_div_inA + E) + 15209178211456919413336795740141505754388379695813905932093982440742677791802n :MSTORE(array_div_long_inA + E) 3 => E - 88987534839350135473536361176867192550264928852523682165693061442019881855583n :MSTORE(array_div_inA + E) + 88987534839350135473536361176867192550264928852523682165693061442019881855583n :MSTORE(array_div_long_inA + E) 4 => E - 14n :MSTORE(array_div_inA + E) - - 4n :MSTORE(array_div_inB) + 14n :MSTORE(array_div_long_inA + E) + 4n :MSTORE(array_div_long_inB) 1 => E - 6n :MSTORE(array_div_inB + E) + 6n :MSTORE(array_div_long_inB + E) 2 => E - 7n :MSTORE(array_div_inB + E) - :CALL(array_div) - 90526669110436282262084097418054683975846294708417529350769755852355732618090n :MLOAD(array_div_quo) + 7n :MSTORE(array_div_long_inB + E) + :CALL(array_div_long) + 90526669110436282262084097418054683975846294708417529350769755852355732618090n :MLOAD(array_div_long_quo) 1 => E - 12712504977050019353362337310981027507180704121789097452241865920288554550795n :MLOAD(array_div_quo + E) + 12712504977050019353362337310981027507180704121789097452241865920288554550795n :MLOAD(array_div_long_quo + E) 2 => E - 2n :MLOAD(array_div_quo + E) - 68257522984529821538496818781776868365702915734670062048456441991373887608168n :MLOAD(array_div_rem) + 2n :MLOAD(array_div_long_quo + E) + 68257522984529821538496818781776868365702915734670062048456441991373887608168n :MLOAD(array_div_long_rem) 1 => E - 104999739448800080833043894267657885589213754954671066702793604491778345346033n :MSTORE(array_div_rem + E) + 104999739448800080833043894267657885589213754954671066702793604491778345346033n :MSTORE(array_div_long_rem + E) 2 => E - 4n :MSTORE(array_div_rem + E) - 3 :MLOAD(array_div_len_quo) - 3 :MLOAD(array_div_len_rem) + 4n :MSTORE(array_div_long_rem + E) + 3 :MLOAD(array_div_long_len_quo) + 3 :MLOAD(array_div_long_len_rem) - ; 15] [0n,0n,0n,0n,87552057494100699607633960453116574392480272162273084008350826812719088235449n,29405388739667337424543497575767709934732594998639086405406332616399343873602n,370491411790392985199n], [0n, 0n, 8238129386n, 23102318237n] + ; 9] [0n,0n,0n,0n,87552057494100699607633960453116574392480272162273084008350826812719088235449n,29405388739667337424543497575767709934732594998639086405406332616399343873602n,370491411790392985199n], [0n, 0n, 8238129386n, 23102318237n] 7 => C 4 => D - 0n :MSTORE(array_div_inA) + 0n :MSTORE(array_div_long_inA) 1 => E - 0n :MSTORE(array_div_inA + E) + 0n :MSTORE(array_div_long_inA + E) 2 => E - 0n :MSTORE(array_div_inA + E) + 0n :MSTORE(array_div_long_inA + E) 3 => E - 0n :MSTORE(array_div_inA + E) + 0n :MSTORE(array_div_long_inA + E) 4 => E - 87552057494100699607633960453116574392480272162273084008350826812719088235449n :MSTORE(array_div_inA + E) + 87552057494100699607633960453116574392480272162273084008350826812719088235449n :MSTORE(array_div_long_inA + E) 5 => E - 29405388739667337424543497575767709934732594998639086405406332616399343873602n :MSTORE(array_div_inA + E) + 29405388739667337424543497575767709934732594998639086405406332616399343873602n :MSTORE(array_div_long_inA + E) 6 => E - 370491411790392985199n :MSTORE(array_div_inA + E) - - 0n :MSTORE(array_div_inB) + 370491411790392985199n :MSTORE(array_div_long_inA + E) + 0n :MSTORE(array_div_long_inB) 1 => E - 0n :MSTORE(array_div_inB + E) + 0n :MSTORE(array_div_long_inB + E) 2 => E - 8238129386n :MSTORE(array_div_inB + E) + 8238129386n :MSTORE(array_div_long_inB + E) 3 => E - 23102318237n :MSTORE(array_div_inB + E) - :CALL(array_div) - 10624890954144362706283399919870985530330343554129711486796784890935496833177n :MLOAD(array_div_quo) + 23102318237n :MSTORE(array_div_long_inB + E) + :CALL(array_div_long) + 10624890954144362706283399919870985530330343554129711486796784890935496833177n :MLOAD(array_div_long_quo) 1 => E - 12699239907746414269759600684072701206520647567004427767570235373004025148518n :MLOAD(array_div_quo + E) + 12699239907746414269759600684072701206520647567004427767570235373004025148518n :MLOAD(array_div_long_quo + E) 2 => E - 62973947849727744055941265906651873030488901951864462234513788026171769471385n :MLOAD(array_div_quo + E) + 62973947849727744055941265906651873030488901951864462234513788026171769471385n :MLOAD(array_div_long_quo + E) 3 => E - 16036979838n :MLOAD(array_div_quo + E) - 0n :MLOAD(array_div_rem) + 16036979838n :MLOAD(array_div_long_quo + E) + 0n :MLOAD(array_div_long_rem) 1 => E - 0n :MSTORE(array_div_rem + E) + 0n :MSTORE(array_div_long_rem + E) 2 => E - 43811746908501644357293832343774991028053014234938611947183500936834952782886n :MSTORE(array_div_rem + E) + 43811746908501644357293832343774991028053014234938611947183500936834952782886n :MSTORE(array_div_long_rem + E) 3 => E - 6019321230n :MSTORE(array_div_rem + E) - 4 :MLOAD(array_div_len_quo) - 4 :MLOAD(array_div_len_rem) - - ; 16] [7n], [7719472615821079694904732333912527190217998977709370935963838933860875309329n, 17n] - 1 => C - 2 => D - 7n :MSTORE(array_div_inA) - 7719472615821079694904732333912527190217998977709370935963838933860875309329n :MSTORE(array_div_inB) - 1 => E - 17n :MSTORE(array_div_inB + E) - :CALL(array_div) - 0n :MLOAD(array_div_quo) - 7n :MLOAD(array_div_rem) - 1 :MLOAD(array_div_len_quo) - 1 :MLOAD(array_div_len_rem) + 6019321230n :MSTORE(array_div_long_rem + E) + 4 :MLOAD(array_div_long_len_quo) + 4 :MLOAD(array_div_long_len_rem) - ; 17] [9,12,16,2,0,2**256-4], [2**256-1,2**256-1] + ; 10] [9,12,16,2,0,2**256-4], [2**256-1,2**256-1] 6 => C 2 => D - 9n :MSTORE(array_div_inA) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inB) + 9n :MSTORE(array_div_long_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inB) 1 => E - 12n :MSTORE(array_div_inA + E) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_div_inB + E) + 12n :MSTORE(array_div_long_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inB + E) 2 => E - 16n :MSTORE(array_div_inA + E) + 16n :MSTORE(array_div_long_inA + E) 3 => E - 2n :MSTORE(array_div_inA + E) + 2n :MSTORE(array_div_long_inA + E) 4 => E - 0n :MSTORE(array_div_inA + E) + 0n :MSTORE(array_div_long_inA + E) 5 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639932n :MSTORE(array_div_inA + E) - :CALL(array_div) - 4 :MLOAD(array_div_len_quo) - 2 :MLOAD(array_div_len_rem) - 17n :MLOAD(array_div_quo) - 26n :MLOAD(array_div_rem) + 115792089237316195423570985008687907853269984665640564039457584007913129639932n :MSTORE(array_div_long_inA + E) + :CALL(array_div_long) + 17n :MLOAD(array_div_long_quo) + 26n :MLOAD(array_div_long_rem) + 1 => E + 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_div_long_quo + E) + 10n :MLOAD(array_div_long_rem + E) + 2 => E + 0n :MLOAD(array_div_long_quo + E) + 3 => E + 115792089237316195423570985008687907853269984665640564039457584007913129639932n :MLOAD(array_div_long_quo + E) + 4 :MLOAD(array_div_long_len_quo) + 2 :MLOAD(array_div_long_len_rem) + + ; 11] [2**256-1]*%ARRAY_MAX_LEN_DOUBLED / [1]*%ARRAY_MAX_LEN + %ARRAY_MAX_LEN_DOUBLED => C + %ARRAY_MAX_LEN => D + C - 1 => E + D - 1 => RR + array_div_long_wc_test_inA: + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inA + E) + E - 1 => E :JMPN(array_div_long_wc_test_inB,array_div_long_wc_test_inA) + array_div_long_wc_test_inB: + 1n :MSTORE(array_div_long_inB + RR) + RR - 1 => RR :JMPN(array_div_long_wc_test_compute,array_div_long_wc_test_inB) + array_div_long_wc_test_compute: + :CALL(array_div_long) + %ARRAY_MAX_LEN_PLUS_ONE => E :MLOAD(array_div_long_len_quo) + 1 :MLOAD(array_div_long_len_rem) + E - 1 => E + %ARRAY_BASE_MINUS_ONE :MLOAD(array_div_long_quo + E) + E - 1 => E + array_div_long_wc_test_check1: + 0n :MLOAD(array_div_long_quo + E) + E - 1 => E :JMPZ(array_div_long_wc_test_check2,array_div_long_wc_test_check1) + array_div_long_wc_test_check2: + %ARRAY_BASE_MINUS_ONE :MLOAD(array_div_long_quo + E) + 0n :MLOAD(array_div_long_rem) + array_div_long_wc_test_end: + + ; 12] [2**256-2]*%ARRAY_MAX_LEN_DOUBLED_MINUS_ONE || [2**256-1] / [1]*%ARRAY_MAX_LEN + %ARRAY_MAX_LEN_DOUBLED => C + %ARRAY_MAX_LEN => D + C - 1 => E + D - 1 => RR + array_div_long_wc2_test_inA: + %ARRAY_BASE_MINUS_TWO :MSTORE(array_div_long_inA + E) + E - 1 => E :JMPZ(array_div_long_wc2_test_inA_part2,array_div_long_wc2_test_inA) + array_div_long_wc2_test_inA_part2: + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_long_inA + E) + array_div_long_wc2_test_inB: + 1n :MSTORE(array_div_long_inB + RR) + RR - 1 => RR :JMPN(array_div_long_wc2_test_compute,array_div_long_wc2_test_inB) + array_div_long_wc2_test_compute: + :CALL(array_div_long) + %ARRAY_MAX_LEN_PLUS_ONE => E :MLOAD(array_div_long_len_quo) + 1 :MLOAD(array_div_long_len_rem) + E - 1 => E + %ARRAY_BASE_MINUS_TWO :MLOAD(array_div_long_quo + E) + E - 1 => E + array_div_long_wc2_test_check1: + 0n :MLOAD(array_div_long_quo + E) + E - 1 => E :JMPZ(array_div_long_wc2_test_check2,array_div_long_wc2_test_check1) + array_div_long_wc2_test_check2: + %ARRAY_BASE_MINUS_TWO :MLOAD(array_div_long_quo + E) + 1n :MLOAD(array_div_long_rem) + array_div_long_wc2_test_end: + ; --------------------------------------------------------------- + + + ; short division + ; --------------------------------------------------------------- + ; 1] inA == 0, inB != 0 + 1 => C + 1 => D + 0n :MSTORE(array_div_short_inA) + 8n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 0n :MLOAD(array_div_short_quo) + 0n :MLOAD(array_div_short_rem) + 1 :MLOAD(array_div_short_len_quo) + + ; 2] inA < inB + 1 => C + 1 => D + 10n :MSTORE(array_div_short_inA) + 11n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 0n :MLOAD(array_div_short_quo) + 10n :MLOAD(array_div_short_rem) + 1 :MLOAD(array_div_short_len_quo) + + ; 3] inA == inB + 1 => C + 1 => D + 10n :MSTORE(array_div_short_inA) + 10n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 1n :MLOAD(array_div_short_quo) + 0n :MLOAD(array_div_short_rem) + 1 :MLOAD(array_div_short_len_quo) + + ; 4] inA = k·inB + 1 => C + 1 => D + 4n :MSTORE(array_div_short_inA) + 2n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 2n :MLOAD(array_div_short_quo) + 0n :MLOAD(array_div_short_rem) + 1 :MLOAD(array_div_short_len_quo) + + ; 5] [9n, 8n, 7n, 6n] / 8n + 4 => C + 1 => D + 9n :MSTORE(array_div_short_inA) + 1 => E + 8n :MSTORE(array_div_short_inA + E) + 2 => E + 7n :MSTORE(array_div_short_inA + E) + 3 => E + 6n :MSTORE(array_div_short_inA + E) + 8n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 1n :MLOAD(array_div_short_quo) + 1 => E + 101318078082651670995624611882601919371611236582435493534525386006923988434945n :MLOAD(array_div_short_quo + E) + 2 => E + 86844066927987146567678238756515930889952488499230423029593188005934847229952n :MLOAD(array_div_short_quo + E) + 1n :MLOAD(array_div_short_rem) + 3 :MLOAD(array_div_short_len_quo) + + ; 6] [a, 7n, a, 12n, a, 20n, a, 80n] / a + 8 => C + 1 => D + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_short_inA) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_div_quo + E) - 10n :MLOAD(array_div_rem + E) + 7n :MSTORE(array_div_short_inA + E) 2 => E - 0n :MLOAD(array_div_quo + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_short_inA + E) 3 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639932n :MLOAD(array_div_quo + E) + 12n :MSTORE(array_div_short_inA + E) + 4 => E + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_short_inA + E) + 5 => E + 20n :MSTORE(array_div_short_inA + E) + 6 => E + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_short_inA + E) + 7 => E + 80n :MSTORE(array_div_short_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 120n :MLOAD(array_div_short_quo) + 1 => E + 112n :MLOAD(array_div_short_quo + E) + 2 => E + 113n :MLOAD(array_div_short_quo + E) + 3 => E + 100n :MLOAD(array_div_short_quo + E) + 4 => E + 101n :MLOAD(array_div_short_quo + E) + 5 => E + 80n :MLOAD(array_div_short_quo + E) + 6 => E + 81n :MLOAD(array_div_short_quo + E) + 119n :MLOAD(array_div_short_rem) + 7 :MLOAD(array_div_short_len_quo) + + ; 7] [28948022309329048855892746252171976963317496166410141009864396001978282409984n, 1n] / 2 + 2 => C + 1 => D + 28948022309329048855892746252171976963317496166410141009864396001978282409984n :MSTORE(array_div_short_inA) + 1 => E + 1n :MSTORE(array_div_short_inA + E) + + 2n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 72370055773322622139731865630429942408293740416025352524660990004945706024960n :MLOAD(array_div_short_quo) + 1 :MLOAD(array_div_short_len_quo) + + ; 8] [72370055773322622139731865630429942408293740416025352524660990004945706024960n] / 2 + 1 => C + 1 => D + 72370055773322622139731865630429942408293740416025352524660990004945706024960n :MSTORE(array_div_short_inA) + 2n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + 36185027886661311069865932815214971204146870208012676262330495002472853012480n :MLOAD(array_div_short_quo) + 1 :MLOAD(array_div_short_len_quo) + + ; 9] [2**256-2]*%ARRAY_MAX_LEN / [2] + %ARRAY_MAX_LEN => C + C - 1 => E + array_div_short_wc_test_inA: + %ARRAY_BASE_MINUS_TWO :MSTORE(array_div_short_inA + E) + E - 1 => E :JMPN(array_div_short_wc_test_compute,array_div_short_wc_test_inA) + array_div_short_wc_test_compute: + 2n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + %ARRAY_MAX_LEN => E :MLOAD(array_div_short_len_quo) + E - 1 => E + array_div_short_wc_test_check1: + %ARRAY_BASE_HALF_MINUS_ONE :MLOAD(array_div_short_quo + E) + E - 1 => E :JMPN(array_div_short_wc_test_check2,array_div_short_wc_test_check1) + array_div_short_wc_test_check2: + 0n :MLOAD(array_div_short_rem) + array_div_short_wc_test_end: + + ; 10] [2**256-2]*%ARRAY_MAX_LEN_MINUS_ONE || [2**256-1] / [2] + %ARRAY_MAX_LEN => C + C - 1 => E + array_div_short_wc2_test_inA: + %ARRAY_BASE_MINUS_TWO :MSTORE(array_div_short_inA + E) + E - 1 => E :JMPZ(array_div_short_wc2_test_inA_part2,array_div_short_wc2_test_inA) + array_div_short_wc2_test_inA_part2: + %ARRAY_BASE_MINUS_ONE :MSTORE(array_div_short_inA + E) + array_div_short_wc2_test_inB: + 2n :MSTORE(array_div_short_inB) + :CALL(array_div_short) + %ARRAY_MAX_LEN => E :MLOAD(array_div_short_len_quo) + E - 1 => E + array_div_short_wc2_test_check1: + %ARRAY_BASE_HALF_MINUS_ONE :MLOAD(array_div_short_quo + E) + E - 1 => E :JMPZ(array_div_short_wc2_test_check2,array_div_short_wc2_test_check1) + array_div_short_wc2_test_check2: + %ARRAY_BASE_HALF_MINUS_ONE :MLOAD(array_div_short_quo + E) + 1n :MLOAD(array_div_short_rem) + array_div_short_wc2_test_end: ; --------------------------------------------------------------- ; division by two @@ -881,80 +1057,17 @@ start: ; 6] [4n] * %ARRAY_MAX_LEN %ARRAY_MAX_LEN => C C - 1 => E - array_div_two_test6: + array_div_two_wc_test: 4n :MSTORE(array_div_two_in + E) - E - 1 => E :JMPN(array_div_two_test6_compute,array_div_two_test6) - array_div_two_test6_compute: + E - 1 => E :JMPN(array_div_two_wc_test_compute,array_div_two_wc_test) + array_div_two_wc_test_compute: :CALL(array_div_two) %ARRAY_MAX_LEN => E :MLOAD(array_div_two_len_quo) E - 1 => E - array_div_two_test6_check: + array_div_two_wc_test_check: 2n :MLOAD(array_div_two_quo + E) - E - 1 => E :JMPN(array_div_two_test6_end,array_div_two_test6_check) - array_div_two_test6_end: - ; --------------------------------------------------------------- - - ; multiplication by two - ; --------------------------------------------------------------- - ; 1] [0n] - 1 => C - 0n :MSTORE(array_mul_two_in) - :CALL(array_mul_two) - 0n :MLOAD(array_mul_two_out) - 1 :MLOAD(array_mul_two_len_out) - - ; 2] [1n] - 1 => C - 1n :MSTORE(array_mul_two_in) - :CALL(array_mul_two) - 2n :MLOAD(array_mul_two_out) - 1 :MLOAD(array_mul_two_len_out) - - ; 3] [4n] - 1 => C - 4n :MSTORE(array_mul_two_in) - :CALL(array_mul_two) - 8n :MLOAD(array_mul_two_out) - 1 :MLOAD(array_mul_two_len_out) - - ; 4] [4n, 4n] - 2 => C - 4n :MSTORE(array_mul_two_in) - 1 => E - 4n :MSTORE(array_mul_two_in + E) - :CALL(array_mul_two) - 8n :MLOAD(array_mul_two_out) - 1 => E - 8n :MLOAD(array_mul_two_out + E) - 2 :MLOAD(array_mul_two_len_out) - - ; 5] [2^255, 2^255] - 2 => C - 57896044618658097711785492504343953926634992332820282019728792003956564819968n :MSTORE(array_mul_two_in) - 1 => E - 57896044618658097711785492504343953926634992332820282019728792003956564819968n :MSTORE(array_mul_two_in + E) - :CALL(array_mul_two) - 0n :MLOAD(array_mul_two_out) - 1 => E - 1n :MLOAD(array_mul_two_out + E) - 2 => E - 1n :MLOAD(array_mul_two_out + E) - 3 :MLOAD(array_mul_two_len_out) - - ; 6] [2^255-1] * %ARRAY_MAX_LEN - %ARRAY_MAX_LEN => C - C - 1 => E - array_mul_two_test6: - 57896044618658097711785492504343953926634992332820282019728792003956564819967n :MSTORE(array_mul_two_in + E) - E - 1 => E :JMPN(array_mul_two_test6_compute,array_mul_two_test6) - array_mul_two_test6_compute: - :CALL(array_mul_two) - %ARRAY_MAX_LEN => E :MLOAD(array_mul_two_len_out) - E - 1 => E - array_mul_two_test6_check: - 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_mul_two_out + E) - E - 1 => E :JMPN(array_mul_two_test6_end,array_mul_two_test6_check) - array_mul_two_test6_end: + E - 1 => E :JMPN(array_div_two_wc_test_end,array_div_two_wc_test_check) + array_div_two_wc_test_end: ; --------------------------------------------------------------- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -966,23 +1079,23 @@ start: ; 1] len(inA) = len(inB) 3 => C 3 => D - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inA) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inA + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inA + E) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inB) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inB) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inB + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inB + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inB + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inB + E) :CALL(array_add) 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_add_out) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_add_out + E) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_add_out + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_add_out + E) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_add_out + E) 3 => E 1n :MLOAD(array_add_out + E) 4 :MLOAD(array_add_len_out) @@ -990,19 +1103,19 @@ start: ; 2] len(inA) = len(inB) + 1 3 => C 2 => D - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inA) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inA) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inA + E) 2 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inA + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inA + E) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inB) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inB) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MSTORE(array_add_inB + E) + %ARRAY_BASE_MINUS_ONE :MSTORE(array_add_inB + E) :CALL(array_add) 115792089237316195423570985008687907853269984665640564039457584007913129639934n :MLOAD(array_add_out) 1 => E - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_add_out + E) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_add_out + E) 2 => E 0n :MLOAD(array_add_out + E) 3 => E @@ -1124,7 +1237,7 @@ start: 1 => E 3n :MSTORE(array_sub_AGTB_inB + E) :CALL(array_sub_AGTB) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_sub_AGTB_out) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_sub_AGTB_out) 1 => E 2n :MLOAD(array_sub_AGTB_out + E) 2 => E @@ -1143,7 +1256,7 @@ start: 1 => E 8n :MSTORE(array_sub_AGTB_inB + E) :CALL(array_sub_AGTB) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_sub_AGTB_out) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_sub_AGTB_out) 1 => E 115792089237316195423570985008687907853269984665640564039457584007913129639928n :MLOAD(array_sub_AGTB_out + E) 2 => E @@ -1162,7 +1275,7 @@ start: 2 => E 7n :MSTORE(array_sub_AGTB_inA + E) :CALL(array_sub_AGTB) - 115792089237316195423570985008687907853269984665640564039457584007913129639935n :MLOAD(array_sub_AGTB_out) + %ARRAY_BASE_MINUS_ONE :MLOAD(array_sub_AGTB_out) 1 => E 115792089237316195423570985008687907853269984665640564039457584007913129639928n :MLOAD(array_sub_AGTB_out + E) 2 => E @@ -1190,6 +1303,38 @@ start: 0n :MLOAD(array_sub_AGTB_out + E) ; --------------------------------------------------------------- + ; division + ; --------------------------------------------------------------- + ; 1] inA == inB == 0 -> error + 1 => C + 1 => D + 0n :MSTORE(array_div_inA) + 0n :MSTORE(array_div_inB) + :CALL(array_div) + 1 => A + B :ASSERT + + ; 2] inA != 0, inB == 0 and len(inA) == 1 -> error + 1 => C + 1 => D + 8n :MSTORE(array_div_inA) + 0n :MSTORE(array_div_inB) + :CALL(array_div) + 1 => A + B :ASSERT + + ; 3] inA != 0, inB and len(inA) > 1 == 0 -> error + 2 => C + 1 => D + 0n :MSTORE(array_div_inA) + 1 => E + 30n :MSTORE(array_div_inA + E) + 0n :MSTORE(array_div_inB) + :CALL(array_div) + 1 => A + B :ASSERT + ; --------------------------------------------------------------- + :JMP(end) outOfCountersBinary: diff --git a/test/testModExp.zkasm b/test/testModExp.zkasm index 99d5e7c7..5e8a2334 100644 --- a/test/testModExp.zkasm +++ b/test/testModExp.zkasm @@ -606,106 +606,106 @@ start: ; 8192 BITS TESTS ; --------------------------------------------------------------------------------------------- ; ; 1] Blen = 16, Elen = 32, Mlen = 1 - ; 16 :MSTORE(modexp_Blen) - ; 32 :MSTORE(modexp_Elen) - ; 1 :MSTORE(modexp_Mlen) + ; 16 :MSTORE(modexp_Blen) + ; 32 :MSTORE(modexp_Elen) + ; 1 :MSTORE(modexp_Mlen) - ; 71050553794075590751574565232558453983936710433844505437607055862219229593147n :MSTORE(modexp_B) - ; 1 => E - ; 2311119566291524187052166030450225884982623802621020117704297191344877127324n :MSTORE(modexp_B + E) - ; 2 => E - ; 41425637949145657150896102319789119277799005821234114655819013119845168507004n :MSTORE(modexp_B + E) - ; 3 => E - ; 27432710158553418316382709013332653477402126158654571642096340165629813029148n :MSTORE(modexp_B + E) - ; 4 => E - ; 64855884914613940606159196869973315039653219108138872452885841451518173265926n :MSTORE(modexp_B + E) - ; 5 => E - ; 114179790520345212766915619197467741272399299487910365242276569807467315404460n :MSTORE(modexp_B + E) - ; 6 => E - ; 65433702517710946687148011723629536032259451607684846408212066673476383092855n :MSTORE(modexp_B + E) - ; 7 => E - ; 70912716282826624595547370701759759731957555830364521210068342278799344565354n :MSTORE(modexp_B + E) - ; 8 => E - ; 108962111922998507767637931201156050693693415833391822856491978062799221246004n :MSTORE(modexp_B + E) - ; 9 => E - ; 104919585803459441841628264650790198163260957103390723319754136236152506833795n :MSTORE(modexp_B + E) - ; 10 => E - ; 110778956830016126801877727623601484344357351150676372632563206106301131401659n :MSTORE(modexp_B + E) - ; 11 => E - ; 89805706387954343243725098969923544675293643610200110483949051893210964773484n :MSTORE(modexp_B + E) - ; 12 => E - ; 49441605214112775122575373711011375251104561280549611203366244610082183044580n :MSTORE(modexp_B + E) - ; 13 => E - ; 26738415432508710188833636324578379506748044875782481656544300498146163965995n :MSTORE(modexp_B + E) - ; 14 => E - ; 90061541830655577695920973192174012989086252925414785698224068317321571729683n :MSTORE(modexp_B + E) - ; 15 => E - ; 104046988730536690188259038943188458054688225850879043983462419897284556724245n :MSTORE(modexp_B + E) - ; 76258746201283982645587901332414432739909461826418801220672878663730191795232n :MSTORE(modexp_E) - ; 1 => E - ; 14229851287285170470957155497391834688082201047771074134798987350533788031156n :MSTORE(modexp_E + E) - ; 2 => E - ; 81533024151778482749430962632322707313027767811611043054284702515386692950687n :MSTORE(modexp_E + E) - ; 3 => E - ; 8141633281699943824118714450443164005237941232831125215672559000204210600323n :MSTORE(modexp_E + E) - ; 4 => E - ; 51007176328061781717633699014696552750308240998656875784646019437161248510022n :MSTORE(modexp_E + E) - ; 5 => E - ; 106071722837234389798554094250828902452432434958153184667260839994459611837342n :MSTORE(modexp_E + E) - ; 6 => E - ; 100230489419677240887089362285203274928102899381652393983569186777557382541779n :MSTORE(modexp_E + E) - ; 7 => E - ; 87879154397947210087106966625197397862735130068646261788426652869771820509616n :MSTORE(modexp_E + E) - ; 8 => E - ; 95910832308024171851618993150481921937992827628570313141587551679301205787653n :MSTORE(modexp_E + E) - ; 9 => E - ; 56325490982677115149543544844429795450475174532268174744912442604171234520684n :MSTORE(modexp_E + E) - ; 10 => E - ; 92279587189196615790442243986095965191470136365218749875229554640748067293976n :MSTORE(modexp_E + E) - ; 11 => E - ; 101742530126141978985767956519943040369255818260170518234107534125239287715046n :MSTORE(modexp_E + E) - ; 12 => E - ; 18149831723885501834780453590048252669895784725869946779703689051215053924210n :MSTORE(modexp_E + E) - ; 13 => E - ; 108418536966335240982622603956904261958086087919448511653867960379666919908120n :MSTORE(modexp_E + E) - ; 14 => E - ; 85375756794768575331981790806560537915310410200315059084018867147198618911418n :MSTORE(modexp_E + E) - ; 15 => E - ; 4695535736413777673751638434146051749639519180545966899214955707210798143404n :MSTORE(modexp_E + E) - ; 16 => E - ; 107686936858044396353050394658951316054078664889790433925695428956196469052437n :MSTORE(modexp_E + E) - ; 17 => E - ; 98992960576649555193444049029191167448401916204443503157924491330688962707702n :MSTORE(modexp_E + E) - ; 18 => E - ; 28831341215365523183447349462928123109504892029366550505460556810244324688706n :MSTORE(modexp_E + E) - ; 19 => E - ; 6244403745121382062454832675509908005308090603466196964416686333235882672199n :MSTORE(modexp_E + E) - ; 20 => E - ; 84799957950134760904298775966516653696788779125526887835464675373737783466153n :MSTORE(modexp_E + E) - ; 21 => E - ; 48627951917191223340396480673320944356213903780640361562966310872761294409321n :MSTORE(modexp_E + E) - ; 22 => E - ; 1998455226609775634086429009803184701438555046525800041821541457512703578341n :MSTORE(modexp_E + E) - ; 23 => E - ; 17111686167104302872480175539141080358546990013870782555784830287161441763067n :MSTORE(modexp_E + E) - ; 24 => E - ; 76956086582271522349024399008827385337580012142740773586608621303394806968931n :MSTORE(modexp_E + E) - ; 25 => E - ; 30820225218026058791918508922913533862480649168455006349251399787799910264751n :MSTORE(modexp_E + E) - ; 26 => E - ; 39574930535822637947710846048091464501920884049550344516411346668145380285447n :MSTORE(modexp_E + E) - ; 27 => E - ; 29958804646464351833720585683972135554033036811000625339867082338282377810146n :MSTORE(modexp_E + E) - ; 28 => E - ; 31855784112983104278650198470116821131218972166134981173356451075709599588548n :MSTORE(modexp_E + E) - ; 29 => E - ; 77693939667794234483665826472458446626151021029641861158955235311230466345870n :MSTORE(modexp_E + E) - ; 30 => E - ; 76470792390833156560070798913966866475970097043371344204493796403126663372415n :MSTORE(modexp_E + E) - ; 31 => E - ; 114988869843408178999479197752358298421236312058743976013813966822126396167278n :MSTORE(modexp_E + E) - ; 72847221021874037642769569132275164094322040442822821773040516004504186942893n :MSTORE(modexp_M) - ; :CALL(modexp) + ; 71050553794075590751574565232558453983936710433844505437607055862219229593147n :MSTORE(modexp_B) + ; 1 => E + ; 2311119566291524187052166030450225884982623802621020117704297191344877127324n :MSTORE(modexp_B + E) + ; 2 => E + ; 41425637949145657150896102319789119277799005821234114655819013119845168507004n :MSTORE(modexp_B + E) + ; 3 => E + ; 27432710158553418316382709013332653477402126158654571642096340165629813029148n :MSTORE(modexp_B + E) + ; 4 => E + ; 64855884914613940606159196869973315039653219108138872452885841451518173265926n :MSTORE(modexp_B + E) + ; 5 => E + ; 114179790520345212766915619197467741272399299487910365242276569807467315404460n :MSTORE(modexp_B + E) + ; 6 => E + ; 65433702517710946687148011723629536032259451607684846408212066673476383092855n :MSTORE(modexp_B + E) + ; 7 => E + ; 70912716282826624595547370701759759731957555830364521210068342278799344565354n :MSTORE(modexp_B + E) + ; 8 => E + ; 108962111922998507767637931201156050693693415833391822856491978062799221246004n :MSTORE(modexp_B + E) + ; 9 => E + ; 104919585803459441841628264650790198163260957103390723319754136236152506833795n :MSTORE(modexp_B + E) + ; 10 => E + ; 110778956830016126801877727623601484344357351150676372632563206106301131401659n :MSTORE(modexp_B + E) + ; 11 => E + ; 89805706387954343243725098969923544675293643610200110483949051893210964773484n :MSTORE(modexp_B + E) + ; 12 => E + ; 49441605214112775122575373711011375251104561280549611203366244610082183044580n :MSTORE(modexp_B + E) + ; 13 => E + ; 26738415432508710188833636324578379506748044875782481656544300498146163965995n :MSTORE(modexp_B + E) + ; 14 => E + ; 90061541830655577695920973192174012989086252925414785698224068317321571729683n :MSTORE(modexp_B + E) + ; 15 => E + ; 104046988730536690188259038943188458054688225850879043983462419897284556724245n :MSTORE(modexp_B + E) + ; 76258746201283982645587901332414432739909461826418801220672878663730191795232n :MSTORE(modexp_E) + ; 1 => E + ; 14229851287285170470957155497391834688082201047771074134798987350533788031156n :MSTORE(modexp_E + E) + ; 2 => E + ; 81533024151778482749430962632322707313027767811611043054284702515386692950687n :MSTORE(modexp_E + E) + ; 3 => E + ; 8141633281699943824118714450443164005237941232831125215672559000204210600323n :MSTORE(modexp_E + E) + ; 4 => E + ; 51007176328061781717633699014696552750308240998656875784646019437161248510022n :MSTORE(modexp_E + E) + ; 5 => E + ; 106071722837234389798554094250828902452432434958153184667260839994459611837342n :MSTORE(modexp_E + E) + ; 6 => E + ; 100230489419677240887089362285203274928102899381652393983569186777557382541779n :MSTORE(modexp_E + E) + ; 7 => E + ; 87879154397947210087106966625197397862735130068646261788426652869771820509616n :MSTORE(modexp_E + E) + ; 8 => E + ; 95910832308024171851618993150481921937992827628570313141587551679301205787653n :MSTORE(modexp_E + E) + ; 9 => E + ; 56325490982677115149543544844429795450475174532268174744912442604171234520684n :MSTORE(modexp_E + E) + ; 10 => E + ; 92279587189196615790442243986095965191470136365218749875229554640748067293976n :MSTORE(modexp_E + E) + ; 11 => E + ; 101742530126141978985767956519943040369255818260170518234107534125239287715046n :MSTORE(modexp_E + E) + ; 12 => E + ; 18149831723885501834780453590048252669895784725869946779703689051215053924210n :MSTORE(modexp_E + E) + ; 13 => E + ; 108418536966335240982622603956904261958086087919448511653867960379666919908120n :MSTORE(modexp_E + E) + ; 14 => E + ; 85375756794768575331981790806560537915310410200315059084018867147198618911418n :MSTORE(modexp_E + E) + ; 15 => E + ; 4695535736413777673751638434146051749639519180545966899214955707210798143404n :MSTORE(modexp_E + E) + ; 16 => E + ; 107686936858044396353050394658951316054078664889790433925695428956196469052437n :MSTORE(modexp_E + E) + ; 17 => E + ; 98992960576649555193444049029191167448401916204443503157924491330688962707702n :MSTORE(modexp_E + E) + ; 18 => E + ; 28831341215365523183447349462928123109504892029366550505460556810244324688706n :MSTORE(modexp_E + E) + ; 19 => E + ; 6244403745121382062454832675509908005308090603466196964416686333235882672199n :MSTORE(modexp_E + E) + ; 20 => E + ; 84799957950134760904298775966516653696788779125526887835464675373737783466153n :MSTORE(modexp_E + E) + ; 21 => E + ; 48627951917191223340396480673320944356213903780640361562966310872761294409321n :MSTORE(modexp_E + E) + ; 22 => E + ; 1998455226609775634086429009803184701438555046525800041821541457512703578341n :MSTORE(modexp_E + E) + ; 23 => E + ; 17111686167104302872480175539141080358546990013870782555784830287161441763067n :MSTORE(modexp_E + E) + ; 24 => E + ; 76956086582271522349024399008827385337580012142740773586608621303394806968931n :MSTORE(modexp_E + E) + ; 25 => E + ; 30820225218026058791918508922913533862480649168455006349251399787799910264751n :MSTORE(modexp_E + E) + ; 26 => E + ; 39574930535822637947710846048091464501920884049550344516411346668145380285447n :MSTORE(modexp_E + E) + ; 27 => E + ; 29958804646464351833720585683972135554033036811000625339867082338282377810146n :MSTORE(modexp_E + E) + ; 28 => E + ; 31855784112983104278650198470116821131218972166134981173356451075709599588548n :MSTORE(modexp_E + E) + ; 29 => E + ; 77693939667794234483665826472458446626151021029641861158955235311230466345870n :MSTORE(modexp_E + E) + ; 30 => E + ; 76470792390833156560070798913966866475970097043371344204493796403126663372415n :MSTORE(modexp_E + E) + ; 31 => E + ; 114988869843408178999479197752358298421236312058743976013813966822126396167278n :MSTORE(modexp_E + E) + ; 72847221021874037642769569132275164094322040442822821773040516004504186942893n :MSTORE(modexp_M) + ; :CALL(modexp) ; 39485175434713692833767794600629031124832788746937134372850464715072794794365n :MLOAD(modexp_out) ; 1n :MLOAD(modexp_outlen) @@ -714,78 +714,78 @@ start: 1 :MSTORE(modexp_Elen) 2 :MSTORE(modexp_Mlen) - 58582339313272081541741091700594438953240612446085692295415022086283220626753n :MSTORE(modexp_B) - 1 => E - 1082278792311219594083944885733732785223732334635289578358568460157040451417n :MSTORE(modexp_B + E) - 2 => E - 19613517917404142784873662366229906237596579118836502522712489678006364018137n :MSTORE(modexp_B + E) - 3 => E - 94585942647244454954435025568500649221875007164723745245117096456516601199618n :MSTORE(modexp_B + E) - 4 => E - 35639633678852084060200900997468850162084312453050227618889913284300596838199n :MSTORE(modexp_B + E) - 5 => E - 78099865031131508842883969354441126147665120063157525313709234612881360425292n :MSTORE(modexp_B + E) - 6 => E - 3465260013338549695646534731938806191895940454762761143209085341490292094583n :MSTORE(modexp_B + E) - 7 => E - 83240820227760283646014632355413985150832638693530940639158230460807255356621n :MSTORE(modexp_B + E) - 8 => E - 62051656904790802038019733921610445956666260367244273275496729381748290153955n :MSTORE(modexp_B + E) - 9 => E - 45666393393776004451398686220386880450315878280561353594540553199247513386595n :MSTORE(modexp_B + E) - 10 => E - 101785040741538888903354844773182179352722786538112190484679500250614319751259n :MSTORE(modexp_B + E) - 11 => E - 110652338015694281068707365417090078516695327755424649221664897939524884103417n :MSTORE(modexp_B + E) - 12 => E - 49243470232752527078453874556325179294416166539728462357711709398098439589335n :MSTORE(modexp_B + E) - 13 => E - 92761635604125986140178553355595569536048741412993352818243357282258747219597n :MSTORE(modexp_B + E) - 14 => E - 107125026528073614477778162400448845380679887461023000294123673028489410115428n :MSTORE(modexp_B + E) - 15 => E - 50015491922034682795400667595741184186461047999761793737177234529134772742883n :MSTORE(modexp_B + E) - 16 => E - 93839364887903211464040378523451721648365970883493581494218955280319875788856n :MSTORE(modexp_B + E) - 17 => E - 17091472401859236813752505473711584993054095047275178116344296041292612882277n :MSTORE(modexp_B + E) - 18 => E - 33133235434716137789301333902142435942934988584475245270513939078566706035139n :MSTORE(modexp_B + E) - 19 => E - 8618563902985774097645699060359830371796371389216077101052936350915552332541n :MSTORE(modexp_B + E) - 20 => E - 32959204030626041166684100562123025735545974992282090777516360003585051763609n :MSTORE(modexp_B + E) - 21 => E - 82767509598720527511245866314874791036239553482587678455676791496639924352817n :MSTORE(modexp_B + E) - 22 => E - 24581016226774148963550354927392864083633602722111543645399304218924673583653n :MSTORE(modexp_B + E) - 23 => E - 54907909205416467790958752093550345903140417587581313515617803654573424767356n :MSTORE(modexp_B + E) - 24 => E - 100791016977344006113073169055960011281141395301059720257405619893429714167341n :MSTORE(modexp_B + E) - 25 => E - 24941924336732284648883856125208379683444168476081791710711797807642735673908n :MSTORE(modexp_B + E) - 26 => E - 84084005778965612817305629593090007081360298325328658417757739306412791334620n :MSTORE(modexp_B + E) - 27 => E - 57802445510214963192751495314468666350299014243361752557159297425362287711690n :MSTORE(modexp_B + E) - 28 => E - 71604073139668550693524183042211626872574021539160119710031007420261347015402n :MSTORE(modexp_B + E) - 29 => E - 112794949372007878255901773641270094155501693398414692888840800526209520944761n :MSTORE(modexp_B + E) - 30 => E - 70731187935137252399476378656555562056546473720901706122635244057158114695508n :MSTORE(modexp_B + E) - 31 => E - 3352858292656216054449205160393741706300333423229119841653557821211210632061n :MSTORE(modexp_B + E) + 58582339313272081541741091700594438953240612446085692295415022086283220626753n :MSTORE(modexp_B) + 1 => E + 1082278792311219594083944885733732785223732334635289578358568460157040451417n :MSTORE(modexp_B + E) + 2 => E + 19613517917404142784873662366229906237596579118836502522712489678006364018137n :MSTORE(modexp_B + E) + 3 => E + 94585942647244454954435025568500649221875007164723745245117096456516601199618n :MSTORE(modexp_B + E) + 4 => E + 35639633678852084060200900997468850162084312453050227618889913284300596838199n :MSTORE(modexp_B + E) + 5 => E + 78099865031131508842883969354441126147665120063157525313709234612881360425292n :MSTORE(modexp_B + E) + 6 => E + 3465260013338549695646534731938806191895940454762761143209085341490292094583n :MSTORE(modexp_B + E) + 7 => E + 83240820227760283646014632355413985150832638693530940639158230460807255356621n :MSTORE(modexp_B + E) + 8 => E + 62051656904790802038019733921610445956666260367244273275496729381748290153955n :MSTORE(modexp_B + E) + 9 => E + 45666393393776004451398686220386880450315878280561353594540553199247513386595n :MSTORE(modexp_B + E) + 10 => E + 101785040741538888903354844773182179352722786538112190484679500250614319751259n :MSTORE(modexp_B + E) + 11 => E + 110652338015694281068707365417090078516695327755424649221664897939524884103417n :MSTORE(modexp_B + E) + 12 => E + 49243470232752527078453874556325179294416166539728462357711709398098439589335n :MSTORE(modexp_B + E) + 13 => E + 92761635604125986140178553355595569536048741412993352818243357282258747219597n :MSTORE(modexp_B + E) + 14 => E + 107125026528073614477778162400448845380679887461023000294123673028489410115428n :MSTORE(modexp_B + E) + 15 => E + 50015491922034682795400667595741184186461047999761793737177234529134772742883n :MSTORE(modexp_B + E) + 16 => E + 93839364887903211464040378523451721648365970883493581494218955280319875788856n :MSTORE(modexp_B + E) + 17 => E + 17091472401859236813752505473711584993054095047275178116344296041292612882277n :MSTORE(modexp_B + E) + 18 => E + 33133235434716137789301333902142435942934988584475245270513939078566706035139n :MSTORE(modexp_B + E) + 19 => E + 8618563902985774097645699060359830371796371389216077101052936350915552332541n :MSTORE(modexp_B + E) + 20 => E + 32959204030626041166684100562123025735545974992282090777516360003585051763609n :MSTORE(modexp_B + E) + 21 => E + 82767509598720527511245866314874791036239553482587678455676791496639924352817n :MSTORE(modexp_B + E) + 22 => E + 24581016226774148963550354927392864083633602722111543645399304218924673583653n :MSTORE(modexp_B + E) + 23 => E + 54907909205416467790958752093550345903140417587581313515617803654573424767356n :MSTORE(modexp_B + E) + 24 => E + 100791016977344006113073169055960011281141395301059720257405619893429714167341n :MSTORE(modexp_B + E) + 25 => E + 24941924336732284648883856125208379683444168476081791710711797807642735673908n :MSTORE(modexp_B + E) + 26 => E + 84084005778965612817305629593090007081360298325328658417757739306412791334620n :MSTORE(modexp_B + E) + 27 => E + 57802445510214963192751495314468666350299014243361752557159297425362287711690n :MSTORE(modexp_B + E) + 28 => E + 71604073139668550693524183042211626872574021539160119710031007420261347015402n :MSTORE(modexp_B + E) + 29 => E + 112794949372007878255901773641270094155501693398414692888840800526209520944761n :MSTORE(modexp_B + E) + 30 => E + 70731187935137252399476378656555562056546473720901706122635244057158114695508n :MSTORE(modexp_B + E) + 31 => E + 3352858292656216054449205160393741706300333423229119841653557821211210632061n :MSTORE(modexp_B + E) 65537n :MSTORE(modexp_E) - 39851039703995454411192288480134431431581770200184123399645359412272832511626n :MSTORE(modexp_M) - 1 => E - 37752885539763212929058244732198218613925905715762498172556148837284915557195n :MSTORE(modexp_M + E) + 39851039703995454411192288480134431431581770200184123399645359412272832511626n :MSTORE(modexp_M) + 1 => E + 37752885539763212929058244732198218613925905715762498172556148837284915557195n :MSTORE(modexp_M + E) :CALL(modexp) - 56022410747783146699662217269120785748464099550239963682054680910629578115775n :MLOAD(modexp_out) - 1 => E - 14493810196578292049955796525564942375140358401736189058384961357909052370153n :MLOAD(modexp_out + E) - 2 :MLOAD(modexp_outlen) + 56022410747783146699662217269120785748464099550239963682054680910629578115775n :MLOAD(modexp_out) + 1 => E + 14493810196578292049955796525564942375140358401736189058384961357909052370153n :MLOAD(modexp_out + E) + 2 :MLOAD(modexp_outlen) ; 3] Blen = Mlen = 32, Elen = 1 32 :MSTORE(modexp_Blen) @@ -982,7 +982,7 @@ start: 12384180274645355595105366212522790398784832091160640277349754557987863589673n :MLOAD(modexp_out + E) 31 => E 40734125863026273932428199995766034988856785758079943910749929611210985198371n :MLOAD(modexp_out + E) - 32 :MLOAD(modexp_outlen) + 32 :MLOAD(modexp_outlen) ; --------------------------------------------------------------------------------------------- ; ; SINGLETON TESTS TO ENSURE THE MAXIMUM INPUT LENGTH WE CAN ACHIEVE IN EACH OF BASE, EXPONENT