Legacy:WUtils/WMath: Difference between revisions
suggestions |
No edit summary |
||
Line 234: | Line 234: | ||
</uscript> | </uscript> | ||
[[Category:Legacy Custom Class|{{PAGENAME}}]] | [[Category:Legacy Custom Class (UT2004)|{{PAGENAME}}]] |
Latest revision as of 16:17, 19 November 2007
<uscript> /////////////////////////////////////////////////////////////////////////////// // filename: wMath.uc // revision: 102 // authors: various UnrealWiki members (http://wiki.beyondunreal.com) // http://wiki.beyondunreal.com/WUtils ///////////////////////////////////////////////////////////////////////////////
class wMath extends Object;
/** Checks if a string is numeric */ static final function bool IsNumeric(coerce string Param, optional bool bPositiveOnly, optional bool bNoFloat) {
local int p;
p=0; while (Mid(Param, p, 1) == " ") p++; if (!bPositiveOnly) if (Mid(Param, p, 1) == "-") p++; while (Mid(Param, p, 1) >= "0" && Mid(Param, p, 1) <= "9" || (!bNoFloat && Mid(Param, p, 1) == ".")) p++; while (Mid(Param, p, 1) == " ") p++; if (Mid(Param, p) != "") return false; return true;
}
/** Check if a string is an int */ static final function bool IsInt(coerce string Param, optional bool bPositiveOnly) {
return IsNumeric(param, bPositiveOnly, true);
}
/** Check if a string is an float (example: '3.14' -> true '3' -> true); */ static final function bool IsFloat(coerce string Param, optional bool bPositiveOnly) {
return IsNumeric(param, bPositiveOnly, false);
}
/* Michaeel's CRC32 code
http//wiki.beyondunreal.com/wiki/CRC32 */
/** This function needs to be called the first time you want to use CRC32 */ static final function CRC32Init(out int CrcTable[256]) {
const CrcPolynomial = 0xedb88320;
local int CrcValue; local int IndexBit; local int IndexEntry; for (IndexEntry = 0; IndexEntry < 256; IndexEntry++) { CrcValue = IndexEntry;
for (IndexBit = 8; IndexBit > 0; IndexBit--) if ((CrcValue & 1) != 0) CrcValue = (CrcValue >>> 1) ^ CrcPolynomial; else CrcValue = CrcValue >>> 1; CrcTable[IndexEntry] = CrcValue; }
}
/** Calculate the CRC32 checksum of Text */ static final function int CRC32(coerce string Text, int CrcTable[256]) {
local int CrcValue; local int IndexChar; CrcValue = 0xffffffff; for (IndexChar = 0; IndexChar < Len(Text); IndexChar++) CrcValue = (CrcValue >>> 8) ^ CrcTable[Asc(Mid(Text, IndexChar, 1)) ^ (CrcValue & 0xff)];
return CrcValue;
}
/** Calculate: C^D mod N */ static final function int PowerMod(int C, int D, int N) {
local int f, g, j; if ( D % 2 == 0) { G = 1; for (j = 1; j <= D/2; j++) { F = (C*C) % N; G = (F*G) % N; } } else { G = C; for (j = 1; j <= D/2; j++) { F = (C*C) % N; G = (F*G) % N; } } return g;
}
/* RSA Encode\Decode methods
Written by El Muerte http//wiki.beyondunreal.com/wiki/RSA */
/** Calculate Greatest Common Divider */ static final private function int _RSAGCD(int e, int PHI) {
local int great, a; if (e > PHI) { while (e%PHI != 0) { a = e%PHI; e = PHI; PHI = a; } great = PHI; } else { while (PHI%e != 0) { a = PHI%e; PHI = e; e = a; } great = e; } return great;
}
/** Used to calculate the public key E
P and Q are primes, P!=Q
You need N=P*Q and E to encrYpt the message */
static final function int RSAPublicKeygen(int p, int q) {
local int PHI, E, great; PHI = (p-1)*(q-1); great = 0; E = 2; while (great != 1) { E = E+1; great = _RSAGCD(E, PHI); } return E;
}
/** PrivateKey is inverse of the Public key E.
You need this key (and N) to decrypt the message */
static final function int RSAPrivateKeygen(int E, int p, int q) {
local int PHI, u1, u2, u3, v1, v2, v3, t1, t2, t3, z; PHI = (p-1)*(q-1); u1 = 1; u2 = 0; u3 = PHI; v1 = 0; v2 = 1; v3 = E; while (v3 != 0) { z = u3/v3; t1 = u1-z*v1; t2 = u2-z*v2; t3 = u3-z*v3; u1 = v1; u2 = v2; u3 = v3; v1 = t1; v2 = t2; v3 = t3; } if (u2 < 0) { return u2 + PHI; } else { return u2; }
}
static final function RSAEncode(coerce string data, int E, int N, out array<int> data2) {
local int i, c; data2.length = len(data); for (i = 0; i < len(data); i++) { c = Asc(Mid(data,i,1)); data2[i] = PowerMod(c,E,N); }
}
static final function string RSADecode(array<int> data, int D, int N) {
local int i, C; local string result; for (i = 0; i < data.length; i++) { c = data[i]; result = result$chr(PowerMod(c,D,N)); } return result;
} </uscript>
Comments
Tarquin: here's a few I've used that you might want to add:
<uscript> function float Sgn( float theValue ) { if( theValue == 0 ) return 0; return theValue / Abs(theValue); } // function modulo static final operator(18) float mod ( float A, float B ) { if( A % B >= 0 ) return A % B ; else return ( A % B ) + B ; } static final operator(24) bool divides ( float A , float B ) { //local float quotient ; //quotient = B / A ; if( int( B / A ) == B / A ) return true ; }
</uscript>