100825/tex/bin100325.txt

1.) Rechne die Zahl in binaer Darstellung  in eine Dezimale Darstellung um
1111100110001100b 63884d
2.) Rechne die Zahl in dezimal darstellung in eine Binaerdarstellung um
1778 0000011011110010
3.) Addiere die drei Zahlen schriftlich
            60875p0
+           46115
+           38602
-----------------
           145592
4.) Subtrahiere die letzten drei Zahlen schriftlich von der ersten schriftlich
             1322
-           11342
-            2078
-            8884
-----------------
           -20982
5.) Rechne die Zahl ins zweier komplement um, mit 8 Bit - und subtrahiere diese zahl von der ersten und rechne das Ergebnis nach dezimal
-58 -60 = -118
11000110 11000100 = 10001010
6.) Multipliziere die zwei Zahlen schriftlich
26021*49394 = 1285281274
7.) Dividiere die zwei Zahlen schriftlich
51349/2178 = 23
8.) Errechne x Logarithmisch mit dem Taschenrechner
40656^x = 2088425080
9.) Errechne mit dem Abakus
2 + 87 + 16 + 41 + 76 + 65 + 33 + 91 + 7 + 32
10.) Errechne mit dem Abakus
4572 + 4894 + 9700 + 2341 + 1662 + 4208 + 5030 + 4186 + 6231 + 6863


====================== solutions:

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 5
m = 97
b = 100
y = 84

x_5 = 65

y := (b * x_i + y) % m;
y = (100 * 65 + 84) % 97;

taschenrechner:

y = (100 * 65 + 84) % 97 = 85

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 6
m = 97
b = 100
y = 85
x_6 = 33

y = (100 * 33 + 85) % 97 = 87

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 7
m = 97
b = 100
y = 87
x_7 = 91

y = (100 * 91 + 91) % 97 = 73

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 8
m = 97
b = 100
y = 91
x_8 = 7

y = (100 * 7 + 91) % 97 = 15

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 9
m = 97
b = 100
y = 15
x_9 = 32

y = (100 * 32 + 15) % 97 = 14

ok: hash-val: 14

################################# 14


#!/bin/bash

# 10/03/25
# (c) David Vajda
# hash table excersize sh

X=(2 87 16 41 76 65 33 91 7 32)
y=0
i=0
b=100
m=97

echo "X=(${X[@]})"
i=0
while [ $i -lt ${#X[@]} ]
do
    y=$((($b*${X[$i]}+$y)%97))
    echo -n "i=$i,x=${X[$i]},y=$y,b=$b,m=$m; "
    i=$(($i+1))
done

echo "(c) David Vajda"
echo "hash table excersize sh"
echo "10/03/25"
date
echo "hash-value: $y"


X=(2 87 16 41 76 65 33 91 7 32)
i=0,x=2,y=6,b=100,m=97; i=1,x=87,y=73,b=100,m=97; i=2,x=16,y=24,b=100,m=97; i=3,x=41,y=50,b=100,m=97; i=4,x=76,y=84,b=100,m=97; i=5,x=65,y=85,b=100,m=97; i=6,x=33,y=87,b=100,m=97; i=7,x=91,y=69,b=100,m=97; i=8,x=7,y=90,b=100,m=97; i=9,x=32,y=89,b=100,m=97; (c) David Vajda
hash table excersize sh
10/03/25
Fr 3. Okt 12:29:09 CEST 2025
hash-value: 89

da war vorher ein fehler drin, nur wo?

AHA, BEI i=8
###############################
y = (100 * 91 + 91) % 97 = 73

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 8
m = 97
b = 100
y = 73
x_8 = 7

y = (100 * 7 + 73) % 97 = 94

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 9
m = 97
b = 100
y = 94
x_9 = 32

y = (100 * 94 + 32) % 97 = 94

nein, da ist irgendein laengerer fehler drin
    ############# time exceeded, keine lust zu suchen ...
    #### jetzt mit C, python 3, pascal, mySQL



/* (C) David Vajda */
/* 10/03/25 */
/* hash excersize C */

#include <stdio.h>

unsigned int hash (unsigned int *, int, int, int);
void hashprintdata (unsigned int *, int);

int main (void) {
    unsigned int X [] = {2, 87, 16, 41, 76, 65, 33, 91, 7, 32};

    printf ("(c) David Vajda\n");
    printf ("10/03/25\n");
    printf ("hash excersize in C\n");
    hashprintdata (X, 10);
    printf ("base=100, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 100));
    printf ("base=64, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 64));
#define HASHDEBUG
    printf ("base=100, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 100));
    printf ("base=64, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 64));

return 0;
}

void hashprintdata (unsigned int *X, int n) {
    int i;

    printf ("X = (");
    for (i = 0;   i < (n-1);  i++)
        printf ("%i, ", X[i]);
    printf ("%i)\n", X[i]);

}

unsigned int hash (unsigned int *X, int n, int m, int b) {
    int i;
    int y = 0;

    for (i = 0;   i < n;   i++) {
        y = (b * X[i] + y) % m;
#ifdef HASHDEBUG
        printf ("i = %i, x = %i,  y = %i,  m = %i, b = %i\n", i, X[i], y, m, b);
#endif
    }
return y;
}


(c) David Vajda
10/03/25
hash excersize in C
X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)
i = 0, x = 2,  y = 6,  m = 97, b = 100
i = 1, x = 87,  y = 73,  m = 97, b = 100
i = 2, x = 16,  y = 24,  m = 97, b = 100
i = 3, x = 41,  y = 50,  m = 97, b = 100
i = 4, x = 76,  y = 84,  m = 97, b = 100
i = 5, x = 65,  y = 85,  m = 97, b = 100
i = 6, x = 33,  y = 87,  m = 97, b = 100
i = 7, x = 91,  y = 69,  m = 97, b = 100
i = 8, x = 7,  y = 90,  m = 97, b = 100
i = 9, x = 32,  y = 89,  m = 97, b = 100
base=100, Ergebnis vom Hashing: 89,
i = 0, x = 2,  y = 31,  m = 97, b = 64
i = 1, x = 87,  y = 70,  m = 97, b = 64
i = 2, x = 16,  y = 27,  m = 97, b = 64
i = 3, x = 41,  y = 32,  m = 97, b = 64
i = 4, x = 76,  y = 46,  m = 97, b = 64
i = 5, x = 65,  y = 35,  m = 97, b = 64
i = 6, x = 33,  y = 13,  m = 97, b = 64
i = 7, x = 91,  y = 17,  m = 97, b = 64
i = 8, x = 7,  y = 77,  m = 97, b = 64
i = 9, x = 32,  y = 88,  m = 97, b = 64
base=64, Ergebnis vom Hashing: 88,
i = 0, x = 2,  y = 6,  m = 97, b = 100
i = 1, x = 87,  y = 73,  m = 97, b = 100
i = 2, x = 16,  y = 24,  m = 97, b = 100
i = 3, x = 41,  y = 50,  m = 97, b = 100
i = 4, x = 76,  y = 84,  m = 97, b = 100
i = 5, x = 65,  y = 85,  m = 97, b = 100
i = 6, x = 33,  y = 87,  m = 97, b = 100
i = 7, x = 91,  y = 69,  m = 97, b = 100
i = 8, x = 7,  y = 90,  m = 97, b = 100
i = 9, x = 32,  y = 89,  m = 97, b = 100
base=100, Ergebnis vom Hashing: 89,
i = 0, x = 2,  y = 31,  m = 97, b = 64
i = 1, x = 87,  y = 70,  m = 97, b = 64
i = 2, x = 16,  y = 27,  m = 97, b = 64
i = 3, x = 41,  y = 32,  m = 97, b = 64
i = 4, x = 76,  y = 46,  m = 97, b = 64
i = 5, x = 65,  y = 35,  m = 97, b = 64
i = 6, x = 33,  y = 13,  m = 97, b = 64
i = 7, x = 91,  y = 17,  m = 97, b = 64
i = 8, x = 7,  y = 77,  m = 97, b = 64
i = 9, x = 32,  y = 88,  m = 97, b = 64
base=64, Ergebnis vom Hashing: 88,

# (c) David Vajda
# 10/03/25
# python 3 - hash excersize

def hash_davevajda (X,n,m,b):
    i = 0
    y = 0
    while i < n:
        y = (b*X[i]+y)%m
        i = i + 1
    return y


print ("(c) David Vajda")
print ("10/03/25")
print ("python 3 - hash excersize")

X = [2, 87, 16, 41, 76, 65, 33, 91, 7, 32]
i = 0
n = len (X)

print (end="X = [")
while i < n - 1:
    print (X[i], end=", ")
    i = i + 1
print (X[i], "]")

i=0
y=0
m=97
b=64

print ("m=97, base=64, hashval=",hash_davevajda(X,n,m,b))
print ("m=97, base=64, hashval=",hash_davevajda(X,n,m,100))


(c) David Vajda
10/03/25
python 3 - hash excersize
X = [2, 87, 16, 41, 76, 65, 33, 91, 7, 32 ]
m=97, base=64, hashval= 88
m=97, base=64, hashval= 89


{ (c) David Vajda }
{ 10/03/25 }
{ Pascal Hash Excersize Program }

program pashash(input,output);

    { hier musste ich mir ein wenig wieder ins gedaechtnis rufen }
    { const, type, var ... das ist die richtige art und weise, variablen, ... zu definieren}
const
    tMinIndex = 1;
    tMaxIndex = 10;
type
    tIndex = tMinIndex .. tMaxIndex;
    tFeld = array [tIndex] of ShortInt;
var
    X: tFeld = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32);
    i: tIndex;
    m: ShortInt;
    b: ShortInt;
function pashash (X: tFeld; n: tIndex; m: ShortInt; b: ShortInt): ShortInt;
var
    i: tIndex;
    y: ShortInt = 0;
begin
    for i := tMinIndex to tMaxIndex do
    begin
        y := (b * X[i] + y) mod m;
    end;
    pashash := y;
end;

begin
    writeln ('(c) David Vajda');
    writeln ('10/03/25');
    writeln ('Pascal Hash Excersize Program');

    write ('X = (');
    for i := tMinIndex to tMaxIndex do
    begin
        write (X[i], ', ')
    end;
    writeln (X[i], ')');
    writeln ('base=64,m=97,hashval=', pashash(X,tMaxIndex,97,64));
    writeln ('base=100,m=97,hashval=', pashash(X,tMaxIndex,97,100));
end.


(c) David Vajda
10/03/25
Pascal Hash Excersize Program
X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32, 32)
base=64,m=97,hashval=88
base=100,m=97,hashval=89


URL: https://mariadb.com/kb/en/user/
MariaDB [(none)]> CREATE USER 'phptest100325'@'localhost';
Query OK, 0 rows affected (0.019 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'phptest100325'@'localhost';
Query OK, 0 rows affected (0.010 sec)

MariaDB [(none)]> SET PASSWORD FOR 'phptest100325'@'localhost' = PASSWORD ('phptest100325');
Query OK, 0 rows affected (0.012 sec)

MariaDB [(none)]> QUIT
Bye
root@www001:/home/david#

<?php
session_start ();
?>

<!--    (c) David Vajda
        php/javascript/hash excersize programm
        10/03/25
-->

<style>

</style>

<script>

</script>

<?php
/*    (c) David Vajda
        php/javascript/hash excersize programm
        10/03/25
*/
$X = array(2, 87, 16, 41, 76, 65, 33, 91, 7, 32);
$i = 0;
$m = 97;
$b = 64;
$n = count($X);
// ich wusste nicht, wie man die laenge eines arrays in php ausdrueckt...
$y = 0;


for ($i = 0;  $i < $n;  $i++)
    $y = ($X[$i]*$b+$y) % $m;

echo "$y";

include ("/home/david/mysqltestuser100325.php");

$dbname="php100325hash";

$db = new PDO ("mysql: localhost", $db_user, $db_password);
$db->query ("CREATE DATABASE " . $dbname . "; ");
$db->query ("USE " . $dbname . "; " );
try {
    $db->query ("CREATE TABLE X (x INTEGER); ");
    $db->query ("CREATE TABLE FuncY (Func TEXT(64), y INTEGER); ");
    $stmt = "";
    for ($i = 0;  $i < $n;  $i++)
        $stmt = $stmt . "INSERT INTO X (x) VALUES ('" . $X[$i] . "'); ";
    echo $stmt;
    $db->query ($stmt);
    $X2 = array ();
    $stmt = $db->query("SELECT x FROM X;");
    while ($row = $stmt->fetch ())
        array_push ($X2, intval($row[0]));
    $i = 0;
    while ($i < $n) {
        echo $X2[$i] . ", ";
        $i = $i + 1;
    }
    $i = 0;
    $y = 0;
    echo "X = (";
    while ($i < $n) {
        echo $X2[$i] . ", ";
        $y = ($b * $X2[$i] + $y) % $m;
        $i = $i + 1;
    }
    echo ")<BR>\n";
    echo "hash val is: " . $y . "<br>\n";
    $db->query ("INSERT INTO FuncY (Func, y) VALUES ('hash-std', " . $y . "); ");
    //$db->query ("DROP DATABASE " . $dbname . "; ");
    session_destroy ();
    exit (0);

}
catch (Exception $e) {
    //$db->query ("DROP DATABASE " . $dbname . "; ");
    session_destroy ();
    exit (0);
}
?>

URL: https://mariadb.com/kb/en/user/
MariaDB [(none)]> CREATE USER 'phptest100325'@'localhost';
Query OK, 0 rows affected (0.019 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'phptest100325'@'localhost';
Query OK, 0 rows affected (0.010 sec)
MariaDB [(none)]> SET PASSWORD FOR 'phptest100325'@'localhost' = PASSWORD ('phptest100325');
Query OK, 0 rows affected (0.012 sec)
MariaDB [(none)]> QUIT
Bye
root@www001:/home/david#
<?php
session_start ();
/*    (c) David Vajda
        php/javascript/hash excersize programm
        10/03/25
*/
$db_user = "phptest100325";
$db_password = "phptest100325";
session_destroy ();
?>

88PHP Notice:  session_start(): Ignoring session_start() because a session is already active in /home/david/mysqltestuser100325.php on line 2
INSERT INTO X (x) VALUES ('2'); INSERT INTO X (x) VALUES ('87'); INSERT INTO X (x) VALUES ('16'); INSERT INTO X (x) VALUES ('41'); INSERT INTO X (x) VALUES ('76'); INSERT INTO X (x) VALUES ('65'); INSERT INTO X (x) VALUES ('33'); INSERT INTO X (x) VALUES ('91'); INSERT INTO X (x) VALUES ('7'); INSERT INTO X (x) VALUES ('32'); 2, 87, 16, 41, 76, 65, 33, 91, 7, 32, X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32, )<BR>
hash val is: 88<br>
PHP Warning:  session_destroy(): Trying to destroy uninitialized session in /home/david/php100325hash.php on line 73
david@www001:~$

MariaDB [php100325hash]> SELECT * FROM X;
+------+
| x    |
+------+
|    2 |
|   87 |
|   16 |
|   41 |
|   76 |
|   65 |
|   33 |
|   91 |
|    7 |
|   32 |
+------+
10 rows in set (0,021 sec)
MariaDB [php100325hash]> DROP DATABASE php100325hash;
Query OK, 2 rows affected (0,028 sec)
MariaDB [(none)]> SELECT * FROM FuncY
    -> ;
ERROR 1046 (3D000): No database selected
MariaDB [(none)]> USE php100325hash;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [php100325hash]> SELECT * FROM FuncY
    -> ;
+----------+------+
| Func     | y    |
+----------+------+
| hash-std |   88 |
+----------+------+
1 row in set (0,001 sec)
MariaDB [php100325hash]>

################################################# adler-32

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)

https://de.wikipedia.org/wiki/Adler-32

 /* Beispielcode zur Berechnung der Adler-32-Prüfsumme */

  #include <stdint.h> // fuer uint8_t/uint32_t
  #include <stddef.h> // fuer size_t
  uint32_t adler32(const void *buf, size_t buflength) {

     const uint8_t *buffer = (const uint8_t*)buf;

     uint32_t s1 = 1;
     uint32_t s2 = 0;

     for (size_t n = 0; n < buflength; n++) {
        s1 = (s1 + buffer[n]) % 65521;
        s2 = (s2 + s1) % 65521;
     }

     return (s2 << 16) | s1;
  }


X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)

groesste primzahl, kleiner 255? (266)
249? 251? 253?

let's make a primzahl check ...
oder sollen wir 100 nehmen, was dann? 97???

informatik gemaess 255 ...

#!/bin/bash

# (c) David Vajda
# Primzahl check from 255 ...
# 10/03/25

echo "(c) David Vajda"
echo "Primzahl check from 255 ..."
echo "10/03/25"


y=255
x=0
while [ $y -gt 0 ]
do
    x=$(($y-1))
    while [ $x -gt 1 ]
    do
        if [ $(($y%$x)) -eq 0 ]
        then
            break
        fi
        x=$(($x-1))
    done
    if [ $x -eq 1 ]
    then
        echo "$y ist eine primazahl"
        break
    fi
    y=$(($y-1))
done

exit

     for (size_t n = 0; n < buflength; n++) {
        s1 = (s1 + buffer[n]) % 65521;
        s2 = (s2 + s1) % 65521;
     }

(c) David Vajda
Primzahl check from 255 ...
10/03/25
251 ist eine primazahl

X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32)

s1 = 1;
s2 = 0;
s1 = (s1 + X_0) % 251 = 3;
s2 = (s2 + s1) % 251 = 3;

s1 = (s1 + X_1) % 251 = (3 + 87) % 251 = 90
s2 = (s2 + s1) % 251 = (3 + 90) % 251 = 93

s1 = (s1 + X_2)  % 251 = (90 + 16) % 251 = 106;
s2 = (s2 + s1) % 251 = (93 + 106) % 251 = 199;

s1 = (s1 + X_3) % 251 = (106 + 41) % 251 = 147;
s2 = (s2 + s1) % 251 = (199 + 147) % 251 = 95

s1 = (s1 + X_4) % 251 = (147 + 76) % 251 = 223;
s2 = (s2 + s1) % 251 = (223 + 95) % 251 = 67;

s1 = (s1 + X_5) % 251 = (223 + 65) % 251 = 37
s2 = (s2 + s1) % 251 = (37 + 67) % 251 = 104

s1 = (s1 + X_6) % 251 = (37 + 33) % 251 = 70
s2 = (s2 + s1) % 251 = (70 + 104) % 251 = 174

s1 = (s1 + X_7) % 251 = (70 + 91) % 251 = 161
s2 = (s2 + s1) %2 251 = (161 + 174) % 251 = 84

s1 = (s1 + X_8) % 251 = (161 + 7) % 251 = 168
s2 = (s2 + s1) % 251 = (168+84) % 251 = 1

s1 = (s1 + X_9) % 251 = (168+32) % 251 = 200
s2 = (s2 + s1) % 251 = (1 + 200) % 251 = 201

s2 = 201, in binaercode:

200/2 = 100 Rest 1
100/2 = 50 Rest 0
50/2 = 25 Rest 0
25/2 = 12 Rest 1
12/2 = 6 Rest 0
6/2 = 3 Rest 0
3/2 = 1 Rest 1
1/2 = 0 Rest 1

1100.1001

ueberpruefung mit kde taschenrechner:
    richtig, ok

s2 << 8

1100.1001.0000.0000

s2 << 8 | s1

1100.1001.1100.1000

bzw:

201200


#!/bin/bash

# 10/03/25
# (c) David Vajda
# hash table excersize sh

X=(2 87 16 41 76 65 33 91 7 32)
y=0
i=0
b=100
m=97

echo "X=(${X[@]})"
i=0
while [ $i -lt ${#X[@]} ]
do
    y=$((($b*${X[$i]}+$y)%97))
    echo -n "i=$i,x=${X[$i]},y=$y,b=$b,m=$m; "
    i=$(($i+1))
done

echo "(c) David Vajda"
echo "hash table excersize sh"
echo "10/03/25"
date
echo "hash-value: $y"

s1=1
s2=0
m=251
echo "X=(${X[@]})"
i=0
while [ $i -lt ${#X[@]} ]
do
    s1=$((($s1+${X[$i]})%$m))
    s2=$((($s1+$s2)%$m))
    echo -n "i=$i,x=${X[$i]},s1=$s1,s2=$s2,m=$m; "
    i=$(($i+1))
done

echo "adler-32-checksum: $s2$s1"


X=(2 87 16 41 76 65 33 91 7 32)
i=0,x=2,y=6,b=100,m=97; i=1,x=87,y=73,b=100,m=97; i=2,x=16,y=24,b=100,m=97; i=3,x=41,y=50,b=100,m=97; i=4,x=76,y=84,b=100,m=97; i=5,x=65,y=85,b=100,m=97; i=6,x=33,y=87,b=100,m=97; i=7,x=91,y=69,b=100,m=97; i=8,x=7,y=90,b=100,m=97; i=9,x=32,y=89,b=100,m=97; (c) David Vajda
hash table excersize sh
10/03/25
Fr 3. Okt 17:34:15 CEST 2025
hash-value: 89
X=(2 87 16 41 76 65 33 91 7 32)
i=0,x=2,s1=3,s2=3,m=251; i=1,x=87,s1=90,s2=93,m=251; i=2,x=16,s1=106,s2=199,m=251; i=3,x=41,s1=147,s2=95,m=251; i=4,x=76,s1=223,s2=67,m=251; i=5,x=65,s1=37,s2=104,m=251; i=6,x=33,s1=70,s2=174,m=251; i=7,x=91,s1=161,s2=84,m=251; i=8,x=7,s1=168,s2=1,m=251; i=9,x=32,s1=200,s2=201,m=251; adler-32-checksum: 201200


/* (C) David Vajda */
/* 10/03/25 */
/* hash excersize C */

#include <stdio.h>

unsigned int hash (unsigned int *, int, int, int);
void hashprintdata (unsigned int *, int);
unsigned int adler32 (unsigned int *X, int, unsigned);

int main (void) {
    unsigned int X [] = {2, 87, 16, 41, 76, 65, 33, 91, 7, 32};

    printf ("(c) David Vajda\n");
    printf ("10/03/25\n");
    printf ("hash and other checksum excersize in C\n");
    hashprintdata (X, 10);
    printf ("base=100, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 100));
    printf ("base=64, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 64));
    printf ("m=251, Ergebnis vom adler-32-checksum: %u, \n", adler32 (X, 10, 251));
#define HASHDEBUG
    printf ("base=100, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 100));
    printf ("base=64, Ergebnis vom Hashing: %i, \n", hash (X, 10, 97, 64));
    printf ("m=251, Ergebnis vom adler-32-checksum: %u, \n", adler32 (X, 10, 251));

return 0;
}

void hashprintdata (unsigned int *X, int n) {
    int i;

    printf ("X = (");
    for (i = 0;   i < (n-1);  i++)
        printf ("%i, ", X[i]);
    printf ("%i)\n", X[i]);

}

unsigned int adler32 (unsigned int *X, int n, unsigned m) {
    int i;
    unsigned char s1 = 1;
    unsigned char s2 = 0;

    for (i = 0;   i < n;   i++) {
        s1 = (s1 + X[i]) % m;
        s2 = (s2 + s1) % m;
#ifdef HASHDEBUG
        printf ("i = %i, x = %i,  s1 = %i,  s2 = %i, m = %i\n", i, X[i], s1, s2, m);
#endif
    }
//return ((s2 << 8) | s1);
return (s2 * 256) + s1;
}

unsigned int hash (unsigned int *X, int n, int m, int b) {
    int i;
    int y = 0;

    for (i = 0;   i < n;   i++) {
        y = (b * X[i] + y) % m;
#ifdef HASHDEBUG
        printf ("i = %i, x = %i,  y = %i,  m = %i, b = %i\n", i, X[i], y, m, b);
#endif
    }
return y;
}




wobei das wiederum nicht stimmt, schliesslich kann ich s1 und s2 ja auch einzeln ausgeben...

### ok, eigentlich stimmt dieses ergebnis, wie in C richtig gesagt, denn, was ich gemacht habe war nicht ganz falsch, aber auch nicht ganz richtig. denn: zunaechst was ich gemacht habe ist BCD 200 und 201 sind so: 201200 bcd zahlen. zahlen wie 256 oder 78 koennen 8 bit zahlen sein, also z.B. 0xef. zunaechst wenn die Ziffern a .. f wie im hex nicht auftauchen, sagt das nichts darueber aus, dass es das nicht ist. diese hier sind mehr oder weniger keine zahlen wie sie ins hex system passen, sondern, wie ip addressen 0..255 also ein byte, dec dargestellt
mit der rueckgabe ist, das, was ich machte, aber ... BCD aehnlich

base=64, Ergebnis vom Hashing: 88,
i = 0, x = 2,  s1 = 3,  s2 = 3, m = 251
i = 1, x = 87,  s1 = 90,  s2 = 93, m = 251
i = 2, x = 16,  s1 = 106,  s2 = 199, m = 251
i = 3, x = 41,  s1 = 147,  s2 = 95, m = 251
i = 4, x = 76,  s1 = 223,  s2 = 67, m = 251
i = 5, x = 65,  s1 = 37,  s2 = 104, m = 251
i = 6, x = 33,  s1 = 70,  s2 = 174, m = 251
i = 7, x = 91,  s1 = 161,  s2 = 84, m = 251
i = 8, x = 7,  s1 = 168,  s2 = 1, m = 251
i = 9, x = 32,  s1 = 200,  s2 = 201, m = 251
m=251, Ergebnis vom adler-32-checksum: 51656,
david@www001:~$


{ (c) David Vajda }
{ 10/03/25 }
{ Pascal Hash Excersize Program }

program pashash(input,output);

    { hier musste ich mir ein wenig wieder ins gedaechtnis rufen }
    { const, type, var ... das ist die richtige art und weise, variablen, ... zu definieren}
const
    tMinIndex = 1;
    tMaxIndex = 10;
type
    tIndex = tMinIndex .. tMaxIndex;
    tFeld = array [tIndex] of ShortInt;
var
    X: tFeld = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32);
    i: tIndex;
    m: ShortInt;
    b: ShortInt;

function Adler32 (X: tFeld; n: tIndex; m: Integer): Integer;
var
    i: tIndex;
    s1: Integer = 1;
    s2: Integer = 0;
begin
    for i := tMinIndex to tMaxIndex do
    begin
        s1 := (s1 + X[i]) mod m;
        s2 := (s2 + s1) mod m;
    end;
    writeln (s1,s2);
    Adler32 := s2 * 256 + s1;
end;

function pashash (X: tFeld; n: tIndex; m: ShortInt; b: ShortInt): ShortInt;
var
    i: tIndex;
    y: ShortInt = 0;
begin
    for i := tMinIndex to tMaxIndex do
    begin
        y := (b * X[i] + y) mod m;
    end;
    pashash := y;
end;

begin
    writeln ('(c) David Vajda');
    writeln ('10/03/25');
    writeln ('Pascal Hash Excersize Program');

    write ('X = (');
    for i := tMinIndex to tMaxIndex do
    begin
        write (X[i], ', ')
    end;
    writeln (X[i], ')');
    writeln ('base=64,m=97,hashval=', pashash(X,tMaxIndex,97,64));
    writeln ('base=100,m=97,hashval=', pashash(X,tMaxIndex,97,100));
    writeln ('base=256,m=251,adler-32-checksum-val=', Adler32(X,tMaxIndex,251));
end.



david@www001:~$ ./pas100325hashchecksumall
(c) David Vajda
10/03/25
Pascal Hash Excersize Program
X = (2, 87, 16, 41, 76, 65, 33, 91, 7, 32, 32)
base=64,m=97,hashval=88
base=100,m=97,hashval=89
base=256,m=251,adler-32-checksum-val=200201
-13880
david@www001:~$


# (c) David Vajda
# 10/03/25
# python 3 - hash excersize

def hash_davevajda (X,n,m,b):
    i = 0
    y = 0
    while i < n:
        y = (b*X[i]+y)%m
        i = i + 1
    return y

def adler32_davevajda (X,n,m):
    i = 0
    s1 = 1
    s2 = 0
    while i < n:
        s1 = (s1 + X[i]) % m
        s2 = (s2 + s1) % m
        i = i + 1
    print(s2,s1)
    return (s2*256)+s1

print ("(c) David Vajda")
print ("10/03/25")
print ("python 3 - hash excersize")

X = [2, 87, 16, 41, 76, 65, 33, 91, 7, 32]
i = 0
n = len (X)

print (end="X = [")
while i < n - 1:
    print (X[i], end=", ")
    i = i + 1
print (X[i], "]")

i=0
y=0
m=97
b=64

print ("m=97, base=64, hashval=",hash_davevajda(X,n,m,b))
print ("m=97, base=100, hashval=",hash_davevajda(X,n,m,100))
print ("m=97, base=256, adler 32 - checksum=",adler32_davevajda(X,n,251))

david@www001:~$ python3 py100325hashchecksumall.py
(c) David Vajda
10/03/25
python 3 - hash excersize
X = [2, 87, 16, 41, 76, 65, 33, 91, 7, 32 ]
m=97, base=64, hashval= 88
m=97, base=100, hashval= 89
201 200
m=97, base=256, adler 32 - checksum= 51656
david@www001:~$

# stark unterscheiden, tut sich fletcher's checksum nicht von adler-32

https://de.wikipedia.org/wiki/Fletcher%E2%80%99s_Checksum

# sum1 und sum2 sind am anfang beide 0 und es wird nicht die letzte primzahl genommen, sondern 255?

# ok ... wie auch immer, kann sein ein paar bestimmte bloecke werden am anfang getan...

sum1 := 0
sum2 := 0
for i := 0 to length (data) do
    sum1 := (sum1 + data[i]) modulo 255
    sum2 := (sum2 + sum1) modulo 255
endfor
checksum := sum1 gefolgt von sum2
return checksum

1995 stellte Mark Adler mit Adler-32 eine Variation von Fletcher-32 vor, bei der modulo 65.521 (die größte Primzahl kleiner 216) gerechnet wird.
... aha!!!

Adler-32 ist eine Variante von Fletcher-32
und ... 1982: Fletcher-32
Adler-32: 1995

######################### parity:


BLOCK: 2, 87, 16, 41, 76, 65, 33, 91, 7, 32

2: 0000 0010b

87/2 = 43 Rest 1
43/2 = 21 Rest 1
21/2 = 10 Rest 1
10/2 = 5 Rest 0
5/2 = 2 Rest 1
2/2 = 1 Rest 0
1/2 = 0 Rest 1

0101 0111b

16: 0001 0000

41/2 = 20 Rest 1
20/2 = 10 Rest 0
10/2 = 5 Rest 0
5/2 = 2 Rest 1
2/2 = 1 Rest 0
1/2 = 0 Rest 1

0010 1001b

76/2 = 38 Rest 0
38/2 = 19 Rest 0
19/2 = 9 Rest 1
9/2 = 4 Rest 1
4/2 = 2 Rest 0
2/2 = 1 Rest 0
1/2 = 0 Rest 1

0100 1100b

65/2 = 32 Rest 1
32/2 = 16 Rest 0
16/2 = 8 Rest 0
8/2 = 4 Rest 0
4/2 = 2 Rest 0
2/2 = 1 Rest 0
1/2 = 0 Rest 1

0100 0001b

33/2 = 16 Rest 1
16/2 = 8 Rest 0
8/2 = 4 Rest 0
4/2 = 2 Rest 0
2/2 = 1 Rest 0
1/2 = 0 Rest 1

0010 0001b

logisch: 0010 0000b ^= 32d

91/2 = 45 Rest 1
45/2 = 22 Rest 1
22/2 = 11 Rest 0
11/2 = 5 Rest 1
5/2 = 2 Rest 1
2/2 = 1 Rest 0
1/2 = 0 Rest 1

0101 1011b

7: 0000 0111b

32: 0010 0000b

ALSO:


BLOCK: 2, 87, 16, 41, 76, 65, 33, 91, 7, 32

2: 0000 0010b
87: 0101 0111b
16: 0001 0000
41:0010 1001b
76: 0100 1100b
65: 0100 0001b
33: 0010 0001b
91: 0101 1011b
7: 0000 0111b
32: 0010 0000b

0000 0010 0101 0111
0001 0000 0010 1001
0100 1100 0100 0001
0010 0001 0101 1011
0000 0111 0010 0000

ANZAHL 1ER:

0000 0010 0101 0111: 6 1er und 10 0er
0001 0000 0010 1001: 4 1er und 12 0er
0100 1100 0100 0001: 5 1er und 11 0er
0010 0001 0101 1011: 7 1er und 9 0er
0000 0111 0010 0000: 4 1er und 12 0er

1er-parity: 26
0er-parity: 54

odd: ja
even: no
none: x

############################### base64

80 Bit nachricht ... 5x16 Byte
what we need is N Bit MOD 6 = 0

aber muss mit byte aufgepumpt werden

96 laesst sich durch 6 teilen, ja weil 48?, 48, weil: 42 ja, weil 30 und 48 auch... ok, ein byte anhaengen
48 * 2 = 96


0000 0010 0101 0111
0001 0000 0010 1001
0100 1100 0100 0001
0010 0001 0101 1011
0000 0111 0010 0000
0000 0000 0000 0000

00:01   0000 0010 0101 0111
02:03   0001 0000 0010 1001
04:05   0100 1100 0100 0001
06:07   0010 0001 0101 1011
08:09   0000 0111 0010 0000
10:11   0000 0000 0000 0000

oder little endian:


01:00   0101 0111 0000 0010
03:02   0010 1001 0001 0000
05:04   0100 0001 0100 1100
07:06   0101 1011 0010 0001
09:08   0010 0000 0000 0111
11:10   0000 0000 0000 0000

base64, an und fuer sich binaer...

base64
000000 100101 011100
010000 001010 010100
110001 000001 001000
010101 101100 000111
001000 000000 000000
000000

ungepacktes base64

00000000 00100101
00011100 00010000
00001010 00010100
00110001 00000001
00001000 00010101
00101100 00000111
00001000 00000000
00000000 00000000

00000000 00100101 00011100 00010000
00001010 00010100 00110001 00000001
00001000 00010101 00101100 00000111
00001000 00000000 00000000 00000000

00:03   00000000 00100101 00011100 00010000
04:07   00001010 00010100 00110001 00000001
08:0B   00001000 00010101 00101100 00000111
0C:0F   00001000 00000000 00000000 00000000

base64 - ascii

https://en.wikipedia.org/wiki/Base64

000000 100101 011100
010000 001010 010100
110001 000001 001000
010101 101100 000111
001000 000000 000000
000000

AlcQKUxBIVsHIAAA

LZW:

achso, halt habe es kapiert!

was inzwischen nicht richtig war, das woerterbuch inzwischen, schon!

https://de.wikipedia.org/wiki/Lempel-Ziv-Welch-Algorithmus

Bei LZW ist Ausgabe wichtig!!!


zeichenlaenge: 1 bit:


0000 0010 0101 0111
0001 0000 0010 1001
0100 1100 0100 0001
0010 0001 0101 1011
0000 0111 0010 0000
0000 0000 0000 0000



00-000-01-001-010-11-10-
0010-0000-0101-00101-
0011-0001-00000-100-1000-01010-110-
1100-00011-1001-000000-0000000-00000000

0x00: 0
0x01: 1
0x02: 00
0x03: 000
0x04: 01
0x05: 001
0x06: 010
0x07: 11
0x08: 10
0x09: 0010
0x0a: 0000
0x0b: 0101
0x0c: 00101
0x0d: 0011
0x0e: 0001
0x0f: 00000
0x10: 100
0x11: 1000
0x12: 01010
0x13: 110
0x14: 1100
0x15: 00011
0x16: 1001
0x17: 000000
0x18: 0000000

triviale tabelle:

0x18 = 11000
5 bit

5Bit * 24 = 120 bit + tabelle
vorher: 16*6 = 96 Bit
ok

bessere tabelle

achso, halt habe es kapiert!

was inzwischen nicht richtig war, das woerterbuch inzwischen, schon!

https://de.wikipedia.org/wiki/Lempel-Ziv-Welch-Algorithmus

Bei LZW ist Ausgabe wichtig!!!

0000 0010 0101 0111
0001 0000 0010 1001
0100 1100 0100 0001
0010 0001 0101 1011
0000 0111 0010 0000
0000 0000 0000 0000



00-000-01-001-010-11-10-
0010-0000-0101-00101-
0011-0001-00000-100-1000-01010-110-
1100-00011-1001-000000-0000000-00000000

0:0-00:0-01-001-010-11-10-
0010-0000-0101-00101-
0011-0001-00000-100-1000-01010-110-
1100-00011-1001-000000-0000000-00000000

??? irgendwie so, jetzt nicht weiter ueben, time exceeded!

ausgabe: 0x00, 0x00, 0x02, 0x01, 0x02, 0x04, 0x01

0x00: 0
0x01: 1
0x02: 00
0x03: 000
0x04: 01
0x05: 001
0x06: 010
0x07: 11
0x08: 10
0x09: 0010
0x0a: 0000
0x0b: 0101
0x0c: 00101
0x0d: 0011
0x0e: 0001
0x0f: 00000
0x10: 100
0x11: 1000
0x12: 01010
0x13: 110
0x14: 1100
0x15: 00011
0x16: 1001
0x17: 000000
0x18: 0000000