Well, "<signature> OP_SWAP OP_CHECKSIG" can handle addition and multiplication on 256-bit numbers. And Schnorr signatures can be used to handle similar things on a single public key. But of course, without OP_CAT, that kind of things are hard.
Although what are the limits for the bit lengths of the multiplicands?
1. If you assume unlimited Script size (which is kind of true, because you can have pre-signed transactions with "<someScript> <key> OP_CHECKSIG", and you can create a chain of transactions), then it is potentially unlimited.
2. If you think about the code of OP, then it is limited to 32-bit values.
3. If you use signatures, then it is limited to 256-bit values.
This does not look like arbitrary-precision multiplication, and the integer constants sprinkled in the code seem to indicate that it can handle 64-bit word sizes.
Well, the Script supports 32-bit chunks by default, so yes, if you multiply two 32-bit values, you can get one 64-bit value, splitted into two chunks.
How does it handle overflow, since you can't directly program the script interpreter itself?
You can use opcodes like OP_LESSTHAN, and similar ones, to decide, what exactly do you want. By the way, if you have addition, then only the last bit is different in that case, so the code with overflow is very similar to the code without it. If you add two 32-bit values, then you can reach some 33-bit number, or drop the most important bit, and reach an equivalent modulo 2^32 (it can be useful in hash functions).
Does it wrap around, or does it perform some other behavior?
You can decide, both solutions are possible.
Edit: And of course, there is also Homomorphic Encryption:
https://duo.com/labs/tech-notes/2p-ecdsa-explainedWhich means, you can use "first=randomA*1337" and "second=randomB*123456", and then make a signature in a way, where by knowing the result of "1337*123456", you will unlock it, and where some combination of "randomA" and "randomB" will protect it from being cracked by the outside observers.
Edit: If you want to multiply by some constant, then you can factor your number. For example, if 1337 is constant, then it means you need 7*191 multiplication. And also note that you can multiply by two or three, and then make squares or cubes.
1337=7*191
123456=2^6*3*643
Also, if you can find a simple sequence, then you can use it. For example, Fibonacci can be achieved by repeating "OP_TUCK OP_ADD". So, it is possible to find some sequence, where your magic number will be present, and then just calculate N-th value of that sequence.
Edit: Multiplication by 7: OP_DUP OP_2DUP OP_ADD OP_ADD OP_DUP OP_ADD OP_ADD
<123456>
<123456> <123456>
<123456> <123456> <123456> <123456>
<123456> <123456> <123456*2>
<123456> <123456*3>
<123456> <123456*3> <123456*3>
<123456> <123456*6>
<123456*7>
Multiplication by 10: OP_DUP OP_ADD OP_DUP OP_DUP OP_ADD OP_DUP OP_ADD OP_ADD
<123456>
<123456> <123456>
<123456*2>
<123456*2> <123456*2>
<123456*2> <123456*2> <123456*2>
<123456*2> <123456*4>
<123456*2> <123456*4> <123456*4>
<123456*2> <123456*8>
<123456*10>
Multiplication by 100: OP_DUP OP_ADD OP_DUP OP_DUP OP_ADD OP_DUP OP_ADD OP_ADD OP_DUP OP_ADD OP_DUP OP_DUP OP_ADD OP_DUP OP_ADD OP_ADD
Multiplication by 1000: OP_DUP OP_ADD OP_DUP OP_DUP OP_ADD OP_DUP OP_ADD OP_ADD OP_DUP OP_ADD OP_DUP OP_DUP OP_ADD OP_DUP OP_ADD OP_ADD OP_DUP OP_ADD OP_DUP OP_DUP OP_ADD OP_DUP OP_ADD OP_ADD
Multiplication by 1337: OP_DUP OP_MUL1000 OP_OVER OP_MUL100 OP_MUL3 OP_ADD OP_OVER OP_MUL10 OP_MUL3 OP_ADD OP_OVER OP_MUL7 OP_ADD