Всё же есть преимущество у встроенных типов:
Код:
? pr=primes([59,2^10]); m=vectorsmall(#pr,j,j*3); s=vectorsmall(#pr,j,j);
? for(k=1,100000, for(j=1,#pr, m[j]+=s[j]; if(m[j]>=pr[j], m[j]-=pr[j]); ); );
time = 3,089 ms.
? pr=primes([59,2^10]); m=vector(#pr,j,j*3); s=vector(#pr,j,j);
? for(k=1,100000, for(j=1,#pr, m[j]+=s[j]; if(m[j]>=pr[j], m[j]-=pr[j]); ); );
time = 6,474 ms.
? pr=primes([59,2^10]); m=vector(#pr,j,j*3); s=vector(#pr,j,j);
? for(k=1,100000, m+=s; for(j=1,#pr, if(m[j]>=pr[j], m[j]-=pr[j]); ); );
time = 2,419 ms.
? pr=primes([59,2^10]); m=vector(#pr,j, Mod(j*3, pr[j])); s=vector(#pr,j, Mod(j, pr[j]));
? for(k=1,100000, m+=s; );
time = 718 ms.
? pr=primes([59,2^10]); n0=3294839204893274832748932748937498327948734; m=(n0*7)\3;
? for(k=1,100000, for(j=1,#pr, d=(n0+m*k+21-1)%pr[j]; ); );
time = 5,382 ms.
? pr=primes([59,2^12]); m=vectorsmall(#pr,j,j*3); s=vectorsmall(#pr,j,j);
? for(k=1,100000, for(j=1,#pr, m[j]+=s[j]; if(m[j]>=pr[j], m[j]-=pr[j]); ); );
time = 10,670 ms.
? pr=primes([59,2^12]); m=vector(#pr,j,j*3); s=vector(#pr,j,j);
? for(k=1,100000, for(j=1,#pr, m[j]+=s[j]; if(m[j]>=pr[j], m[j]-=pr[j]); ); );
time = 24,057 ms.
? pr=primes([59,2^12]); m=vector(#pr,j,j*3); s=vector(#pr,j,j);
? for(k=1,100000, m+=s; for(j=1,#pr, if(m[j]>=pr[j], m[j]-=pr[j]); ); );
time = 8,486 ms.
? pr=primes([59,2^12]); m=vector(#pr,j, Mod(j*3, pr[j])); s=vector(#pr,j, Mod(j, pr[j]));
? for(k=1,100000, m+=s; );
time = 2,528 ms.
? pr=primes([59,2^12]); n0=3294839204893274832748932748937498327948734; m=(n0*7)\3;
? for(k=1,100000, for(j=1,#pr, d=(n0+m*k+21-1)%pr[j]; ); );
time = 19,032 ms.
Видите, сложение векторов почти втрое быстрее.
К сожалению vectorsmall+vectorsmall не работает.
А сложение сразу модулярных типов ещё втрое быстрее.
Длинные деления почти на порядок медленнее.