Compare commits

14 Commits

Author SHA1 Message Date
Zheyuan Wu
932b0f13a7 Update Math4202_L30.md
Some checks failed
Sync from Gitea (main→main, keep workflow) / mirror (push) Has been cancelled
2026-04-03 11:53:30 -05:00
Zheyuan Wu
60da9d6543 update graph 2026-04-03 11:21:20 -05:00
Zheyuan Wu
d6bc8375ce update
Some checks failed
Sync from Gitea (main→main, keep workflow) / mirror (push) Has been cancelled
2026-04-02 15:17:50 -05:00
Zheyuan Wu
96f5304400 Merge branch 'main' of https://git.trance-0.com/Trance-0/NoteNextra-origin 2026-04-01 14:23:39 -05:00
Zheyuan Wu
713d6e14e2 updates 2026-04-01 14:23:37 -05:00
Zheyuan Wu
9bf031e870 Merge branch 'main' of https://git.trance-0.com/Trance-0/NoteNextra-origin
Some checks failed
Sync from Gitea (main→main, keep workflow) / mirror (push) Has been cancelled
2026-03-31 12:49:20 -05:00
Zheyuan Wu
149b151945 Create CSE4303_L17.md 2026-03-31 12:49:17 -05:00
Zheyuan Wu
a5ea6f86a7 updates 2026-03-31 00:51:59 -05:00
Zheyuan Wu
68e4b83aa1 Update Math4302_L29.md 2026-03-30 13:51:15 -05:00
Zheyuan Wu
9ee7805a0f update
Some checks failed
Sync from Gitea (main→main, keep workflow) / mirror (push) Has been cancelled
2026-03-30 13:25:02 -05:00
Zheyuan Wu
f3f57cbefb update 2026-03-30 12:58:35 -05:00
Zheyuan Wu
461135ee9d updates
Some checks failed
Sync from Gitea (main→main, keep workflow) / mirror (push) Has been cancelled
2026-03-27 13:51:39 -05:00
Zheyuan Wu
0e0ca39f0a updates 2026-03-27 11:50:01 -05:00
Zheyuan Wu
87a5182ac6 update
Some checks failed
Sync from Gitea (main→main, keep workflow) / mirror (push) Has been cancelled
2026-03-25 20:18:14 -05:00
17 changed files with 2193 additions and 7 deletions

View File

@@ -0,0 +1,430 @@
# CSE4303 Introduction to Computer Security (Lecture 17)
> Due to lack of my attention, this lecture note is generated by AI to create continuations of the previous lecture note. I kept this warning because the note was created by AI.
#### Software security
### Administrative notes
#### Project details
- Project plan
- Thursday, `4/9` at the end of class
- `5%`
- Written document and presentation recording
- Thursday, `4/30` at `11:30 AM`
- `15%`
- View peer presentations and provide feedback
- Wednesday, `5/6` at `11:59 PM`
- `5%`
#### Upcoming schedule
- This week (`3/20`)
- software security lecture
- studio
- some time for studio on Tuesday
- Next week (`4/6`)
- fuzzing
- some time to discuss project ideas
- `4/13`
- Web security
- `4/20`
- Privacy and ethics overview
- time to work on projects
- course wrap-up
### Overview
#### Outline
- Context
- Prominent software vulnerabilities and exploits
- Buffer overflows
- Background: C code, compilation, memory layout, execution
- Baseline exploit
- Challenges
- Defenses, countermeasures, counter-countermeasures
Sources:
- SEED lab book
- Gilbert/Tamassia book
- Slides from Bryant/O'Hallaron (CMU), Dan Boneh (Stanford), Michael Hicks (UMD)
### Context
#### Context: computing stack (informal)
| Layer | Example |
| --- | --- |
| Application | web server, standalone app |
| Compiler / assembler | `gcc`, `clang` |
| OS: syscalls | `execve()`, `setuid()`, `write()`, `open()`, `fork()` |
| OS: processes, mem layout | Linux virtual memory layout |
| Architecture (ISA, execution) | x86, x86_64, ARM |
| Hardware | Intel Sky Lake processor |
- User control is strongest near the application / compiler level.
- System control becomes more important as we move down toward OS, architecture, and hardware.
### Prominent software vulnerabilities and exploits
#### Software security: categories
- Race conditions
- Privilege escalation
- Path traversal
- Environment variable modification
- Language-specific vulnerabilities
- Format string attack
- Buffer overflows
#### Buffer Overflows (BoFs)
- A buffer overflow is a bug that affects low-level code, typically in C and C++, with significant security implications.
- Normally, a program with this bug will simply crash.
- But an attacker can alter the situations that cause the program to do much worse.
- Steal private information
- e.g. Heartbleed
- Corrupt valuable information
- Run code of the attacker's choice
#### Application behavior
- Slide contains a figure only.
- Intended point: normal application behavior can become attacker-controlled if input handling is unsafe.
#### BoFs: why do we care?
- Reference from slide: [IEEE Spectrum top programming languages 2025](https://spectrum.ieee.org/top-programming-languages-2025)
#### Critical systems in C/C++
- Most OS kernels and utilities
- `fingerd`
- X windows server
- shell
- Many high-performance servers
- Microsoft IIS
- Apache `httpd`
- `nginx`
- Microsoft SQL Server
- MySQL
- `redis`
- `memcached`
- Many embedded systems
- Mars rover
- industrial control systems
- automobiles
A successful attack on these systems can be particularly dangerous.
#### Morris Worm
- Slide contains a figure / historical reference only.
- It is included as an example of how memory-corruption vulnerabilities mattered in practice.
#### Why do we still care?
- The slide references the NVD search page: [NVD vulnerability search](https://nvd.nist.gov/vuln/search)
- Why the drop?
- Memory-safe languages
- Rust
- Go
- Stronger defenses
- Fuzzing
- find bugs before release
- Change in development practices
- code review
- static analysis tools
- related engineering improvements
#### MITRE Top 25 2025
- Reference from slide: [MITRE CWE Top 25](http://cwe.mitre.org/top25/)
### Buffer overflows
#### Outline
- System Basics
- Application memory layout
- How does function call work under the hood
- `32-bit x86` only
- `64-bit x86_64` similar, but with important differences
- Buffer overflow
- Overwriting the return address pointer
- Point it to shell code injected
#### Buffer Overflows (BoFs)
- 2-minute version first, then all background / full version
#### Process memory layout: virtual address space
- Slide reference: [virtual address space reference](https://hungys.xyz/unix-prog-process-environment/)
#### Process memory layout: function calls
- Slide reference: [Tenouk function call figure 1](http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2.html)
- Slide reference: [Tenouk function call figure 2](http://www.tenouk.com/Bufferoverflowc/Bufferoverflow4.html)
#### Process memory layout: compromised frame
- Slide reference: [Tenouk compromised frame figure](http://www.tenouk.com/Bufferoverflowc/Bufferoverflow4.html)
#### Computer System
High-level examples used in the slide:
```c
car *c = malloc(sizeof(car));
c->miles = 100;
c->gals = 17;
float mpg = get_mpg(c);
free(c);
```
```java
Car c = new Car();
c.setMiles(100);
c.setGals(17);
float mpg = c.getMPG();
```
Assembly-language example used in the slide:
```asm
get_mpg:
pushq %rbp
movq %rsp, %rbp
...
popq %rbp
ret
```
- The same computation can be viewed at multiple levels:
- C / Java source
- assembly language
- machine code
- operating system context
#### Little Theme 1: Representation
- All digital systems represent everything as `0`s and `1`s.
- The `0` and `1` are really two different voltage ranges in wires.
- Or magnetic positions on a disk, hole depths on a DVD, or even DNA.
- "Everything" includes:
- numbers
- integers and floating point
- characters
- building blocks of strings
- instructions
- directives to the CPU that make up a program
- pointers
- addresses of data objects stored in memory
- These encodings are stored throughout the computer system.
- registers
- caches
- memories
- disks
- They all need addresses.
- find an item
- find a place for a new item
- reclaim memory when data is no longer needed
#### Little Theme 2: Translation
- There is a big gap between how we think about programs / data and the `0`s and `1`s of computers.
- We need languages to describe what we mean.
- These languages must be translated one level at a time.
- Example point from the slide:
- we know Java as a programming language
- but we must work down to the `0`s and `1`s of computers
- we try not to lose anything in translation
- we encounter Java bytecode, C, assembly, and machine code
#### Little Theme 3: Control Flow
- How do computers orchestrate everything they are doing?
- Within one program:
- How are `if/else`, loops, and switches implemented?
- How do we track nested procedure calls?
- How do we know what to do upon `return`?
- At the operating-system level:
- library loading
- sharing system resources
- memory
- I/O
- disks
#### HW/SW Interface: Code / Compile / Run Times
- Code time
- user program in C
- `.c` file
- Compile time
- C compiler
- assembler
- Run time
- executable `.exe` file
- hardware executes it
- Note from slide:
- the compiler and assembler are themselves just programs developed using this same process
#### Assembly Programmer's View
- Programmer-visible CPU / memory state
- Program counter
- address of next instruction
- called `RIP` in x86-64
- Named registers
- heavily used program data
- together called the register file
- Condition codes
- store status information about most recent arithmetic operation
- used for conditional branching
- Memory
- byte-addressable array
- contains code and user data
- includes the stack for supporting procedures
#### Turning C into Object Code
- Code in files `p1.c` and `p2.c`
- Compile with:
```bash
gcc -Og p1.c p2.c -o p
```
- Notes from the slide
- `-Og` uses basic optimizations
- resulting machine code goes into file `p`
- Translation chain
- C program -> assembly program -> object program -> executable program
- Associated tools
- compiler
- assembler
- linker
- static libraries (`.a`)
#### Machine Instruction Example
- C code
```c
*dest = t;
```
- Meaning
- store value `t` where designated by `dest`
- Assembly
```asm
movq %rsi, (%rdx)
```
- Interpretation
- move 8-byte value to memory
- operands
- `t` is in register `%rsi`
- `dest` is in register `%rdx`
- `*dest` means memory `M[%rdx]`
- Object code
```text
0x400539: 48 89 32
```
- It is a 3-byte instruction stored at address `0x400539`.
#### IA32 Registers - 32 bits wide
- General-purpose register families shown in the slide
- `%eax`, `%ax`, `%ah`, `%al`
- `%ecx`, `%cx`, `%ch`, `%cl`
- `%edx`, `%dx`, `%dh`, `%dl`
- `%ebx`, `%bx`, `%bh`, `%bl`
- `%esi`, `%si`
- `%edi`, `%di`
- `%esp`, `%sp`
- `%ebp`, `%bp`
- Roles highlighted in the slide
- accumulate
- counter
- data
- base
- source index
- destination index
- stack pointer
- base pointer
#### Data Sizes
- Slide is primarily a figure summarizing common integer widths and sizes.
#### Assembly Data Types
- "Integer" data of `1`, `2`, `4`, or `8` bytes
- data values
- addresses / untyped pointers
- No aggregate types such as arrays or structures at the assembly level
- just contiguous bytes in memory
- Two common syntaxes
- `AT&T`
- used in the course, slides, textbook, GNU tools
- `Intel`
- used in Intel documentation and Intel tools
- Need to know which syntax you are reading because operand order may be reversed.
#### Three Basic Kinds of Instructions
- Transfer data between memory and register
- load
- `%reg = Mem[address]`
- store
- `Mem[address] = %reg`
- Perform arithmetic on register or memory data
- examples: addition, shifting, bitwise operations
- Control flow
- unconditional jumps to / from procedures
- conditional branches
#### Abstract Memory Layout
```text
High addresses
Stack <- local variables, procedure context
Dynamic Data <- heap, new / malloc
Static Data <- globals / static variables
Literals <- large constants such as strings
Instructions
Low addresses
```
#### The ELF File Format
- ELF = Executable and Linkable Format
- One of the most widely used binary object formats
- ELF is architecture-independent
- ELF file types
- Relocatable
- must be fixed by the linker before execution
- Executable
- ready for execution
- Shared
- shared libraries with linking information
- Core
- core dumps created when a program terminates with a fault
- Tools mentioned on slide
- `readelf`
- `file`
- `objdump -D`
#### Process Memory Layout (32-bit x86 machine)
- This slide is primarily a diagram.
- Key idea: a `32-bit x86` process has a standard virtual memory layout with code, static data, heap, and stack arranged in distinct regions.
We continue with the concrete runtime layout and the actual overflow mechanics in Lecture 18.

View File

@@ -0,0 +1,594 @@
# CSE4303 Introduction to Computer Security (Lecture 18)
> Due to lack of my attention, this lecture note is generated by AI to create continuations of the previous lecture note. I kept this warning because the note was created by AI.
#### Software security
### Overview
#### Outline
- Context
- Prominent software vulnerabilities and exploits
- Buffer overflows
- Background: C code, compilation, memory layout, execution
- Baseline exploit
- Challenges
- Defenses, countermeasures, counter-countermeasures
### Buffer overflows
#### All programs are stored in memory
- The process's view of memory is that it owns all of it.
- For a `32-bit` process, the virtual address space runs from:
- `0x00000000`
- to `0xffffffff`
- In reality, these are virtual addresses.
- The OS and CPU map them to physical addresses.
#### The instructions themselves are in memory
- Program text is also stored in memory.
- The slide shows instructions such as:
```asm
0x4c2 sub $0x224,%esp
0x4c1 push %ecx
0x4bf mov %esp,%ebp
0x4be push %ebp
```
- Important point:
- code and data are both memory-resident
- control flow therefore depends on values stored in memory
#### Data's location depends on how it's created
- Static initialized data example
```c
static const int y = 10;
```
- Static uninitialized data example
```c
static int x;
```
- Command-line arguments and environment are set when the process starts.
- Stack data appears when functions run.
```c
int f() {
int x;
...
}
```
- Heap data appears at runtime.
```c
malloc(sizeof(long));
```
- Summary from the slide
- Known at compile time
- text
- initialized data
- uninitialized data
- Set when process starts
- command line and environment
- Runtime
- stack
- heap
#### We are going to focus on runtime attacks
- Stack and heap grow in opposite directions.
- Compiler-generated instructions adjust the stack size at runtime.
- The stack pointer tracks the active top of the stack.
- Repeated `push` instructions place values onto the stack.
- The slides use the sequence:
- `push 1`
- `push 2`
- `push 3`
- `return`
- Heap allocation is apportioned by the OS and managed in-process by `malloc`.
- The lecture says: focusing on the stack for now.
```text
0x00000000 0xffffffff
Heap ---------------------------------> <--------------------------------- Stack
```
#### Stack layout when calling functions
Questions asked on the slide:
- What do we do when we call a function?
- What data need to be stored?
- Where do they go?
- How do we return from a function?
- What data need to be restored?
- Where do they come from?
Example used in the slide:
```c
void func(char *arg1, int arg2, int arg3)
{
char loc1[4];
int loc2;
int loc3;
}
```
Important layout points:
- Arguments are pushed in reverse order of code.
- Local variables are pushed in the same order as they appear in the code.
- The slide then introduces two unknown slots between locals and arguments.
#### Accessing variables
Example:
```c
void func(char *arg1, int arg2, int arg3)
{
char loc1[4];
int loc2;
int loc3;
...
loc2++;
...
}
```
Question from the slide:
- Where is `loc2`?
Step-by-step answer developed in the slides:
- Its absolute address is undecidable at compile time.
- We do not know exactly where `loc2` is in absolute memory.
- We do not know how many arguments there are in general.
- But `loc2` is always a fixed offset before the frame metadata.
- This motivates the frame pointer.
Definitions from the slide:
- Stack frame
- the current function call's region on the stack
- Frame pointer
- `%ebp`
- Example answer
- `loc2` is at `-8(%ebp)`
#### Notation
- `%ebp`
- a memory address stored in the frame-pointer register
- `(%ebp)`
- the value at memory address `%ebp`
- like dereferencing a pointer
The slide sequence then shows:
```asm
pushl %ebp
movl %esp, %ebp
```
- Meaning:
- first save the old frame pointer on the stack
- then set the new frame pointer to the current stack pointer
#### Returning from functions
Example caller:
```c
int main()
{
...
func("Hey", 10, -3);
...
}
```
Questions from the slides:
- How do we restore `%ebp`?
- How do we resume execution at the correct place?
Slide answers:
- Push `%ebp` before locals.
- Set `%ebp` to current `%esp`.
- Set `%ebp` to `(%ebp)` at return.
- Push next `%eip` before `call`.
- Set `%eip` to `4(%ebp)` at return.
#### Stack and functions: Summary
- Calling function
- push arguments onto the stack in reverse order
- push the return address
- the address of the instruction that should run after control returns
- jump to the function's address
- Called function
- push old frame pointer `%ebp` onto the stack
- set frame pointer `%ebp` to current `%esp`
- push local variables onto the stack
- access locals as offsets from `%ebp`
- Returning function
- reset previous stack frame
- `%ebp = (%ebp)`
- jump back to return address
- `%eip = 4(%ebp)`
#### Quick overview (again)
- Buffer
- contiguous set of a given data type
- common in C
- all strings are buffers of `char`
- Overflow
- put more into the buffer than it can hold
- Question
- where does the extra data go?
- Slide answer
- now that we know memory layouts, we can reason about where the overwrite lands
#### A buffer overflow example
Example 1 from the slide:
```c
void func(char *arg1)
{
char buffer[4];
strcpy(buffer, arg1);
...
}
int main()
{
char *mystr = "AuthMe!";
func(mystr);
...
}
```
Step-by-step effect shown in the slides:
- Initial stack region includes:
- `buffer`
- saved `%ebp`
- saved `%eip`
- `&arg1`
- First 4 bytes copied:
- `A u t h`
- Remaining bytes continue writing:
- `M e ! \0`
- Because `strcpy` keeps copying until it sees `\0`, bytes go past the end of the buffer.
- In the example, upon return:
- `%ebp` becomes `0x0021654d`
- Result:
- segmentation fault
- shown as `SEGFAULT (0x00216551)` in the slide sequence
#### A buffer overflow example: changing control data vs. changing program data
Example 2 from the slide:
```c
void func(char *arg1)
{
int authenticated = 0;
char buffer[4];
strcpy(buffer, arg1);
if (authenticated) { ... }
}
int main()
{
char *mystr = "AuthMe!";
func(mystr);
...
}
```
Step-by-step effect shown in the slides:
- Initial stack contains:
- `buffer`
- `authenticated`
- saved `%ebp`
- saved `%eip`
- `&arg1`
- Overflow writes:
- `A u t h` into `buffer`
- `M e ! \0` into `authenticated`
- Result:
- code still runs
- user now appears "authenticated"
Important lesson:
- A buffer overflow does not need to crash.
- It may silently change program data or logic.
#### `gets` vs `fgets`
Unsafe function shown in the slide:
```c
void vulnerable()
{
char buf[80];
gets(buf);
}
```
Safer version shown in the slide:
```c
void safe()
{
char buf[80];
fgets(buf, 64, stdin);
}
```
Even safer pattern from the next slide:
```c
void safer()
{
char buf[80];
fgets(buf, sizeof(buf), stdin);
}
```
Reference from slide:
- [List of vulnerable C functions](https://security.web.cern.ch/security/recommendations/en/codetools/c.shtml)
#### User-supplied strings
- In the toy examples, the strings are constant.
- In reality they come from users in many ways:
- text input
- packets
- environment variables
- file input
- Validating assumptions about user input is extremely important.
#### What's the worst that could happen?
Using:
```c
char buffer[4];
strcpy(buffer, arg1);
```
- `strcpy` will let you write as much as you want until a `\0`.
- If attacker-controlled input is long enough, the memory past the buffer becomes "all ours" from the attacker's perspective.
- That raises the key question from the slide:
- what could you write to memory to wreak havoc?
#### Code injection
- Title-only transition slide.
- It introduces the move from accidental overwrite to deliberate attacker payloads.
#### High-level idea
Example used in the slide:
```c
void func(char *arg1)
{
char buffer[4];
sprintf(buffer, arg1);
...
}
```
Two-step plan shown in the slides:
- 1. Load my own code into memory.
- 2. Somehow get `%eip` to point to it.
The slide sequence draws this as:
- vulnerable buffer on stack
- attacker-controlled bytes placed in memory
- `%eip` redirected toward those bytes
#### This is nontrivial
- Pulling off this attack requires getting a few things really right, and some things only sorta right.
- The lecture says to think about what is tricky about the attack.
- Main security idea:
- the key to defending it is to make the hard parts really hard
#### Challenge 1: Loading code into memory
- The attacker payload must be machine-code instructions.
- already compiled
- ready to run
- We have to be careful in how we construct it.
- It cannot contain all-zero bytes.
- otherwise `sprintf`, `gets`, `scanf`, and similar routines stop copying
- It cannot make use of the loader.
- because we are injecting the bytes directly
- It cannot use the stack.
- because we are in the process of smashing it
- The lecture then gives the name:
- shellcode
#### What kind of code would we want to run?
- Goal: full-purpose shell
- code to launch a shell is called shellcode
- it is nontrivial to write shellcode that works as injected code
- no zeroes
- cannot use the stack
- no loader dependence
- there are many shellcodes already written
- there are even competitions for writing the smallest shellcode
- Goal: privilege escalation
- ideally, attacker goes from guest or non-user to root
#### Shellcode
High-level C version shown in the slides:
```c
#include <stdio.h>
int main() {
char *name[2];
name[0] = "/bin/sh";
name[1] = NULL;
execve(name[0], name, NULL);
}
```
Assembly version shown in the slides:
```asm
xorl %eax, %eax
pushl %eax
pushl $0x68732f2f
pushl $0x6e69622f
movl %esp, %ebx
pushl %eax
...
```
Machine-code bytes shown in the slides:
```text
"\x31\xc0"
"\x50"
"\x68""//sh"
"\x68""/bin"
"\x89\xe3"
"\x50"
...
```
Important point from the slide:
- those machine-code bytes can become part of the attacker's input
#### Challenge 2: Getting our injected code to run
- We cannot insert a fresh "jump into my code" instruction.
- We must use whatever code is already running.
#### Hijacking the saved `%eip`
- Strategy:
- overwrite the saved return address
- make it point into the injected bytes
- Core idea:
- when the function returns, the CPU loads the overwritten return address into `%eip`
Question raised by the slides:
- But how do we know the address?
Failure mode shown in the slide sequence:
- if the guessed address is wrong, the CPU tries to execute data bytes
- this is most likely not valid code
- result:
- invalid instruction
- CPU "panic" / crash
#### Challenge 3: Finding the return address
- If we do not have the code, we may not know how far the buffer is from the saved `%ebp`.
- One approach:
- try many different values
- Worst case:
- `2^32` possible addresses on `32-bit`
- `2^64` possible addresses on `64-bit`
- But without address randomization:
- the stack always starts from the same fixed address
- the stack grows, but usually not very deeply unless heavily recursive
#### Improving our chances: nop sleds
- `nop` is a single-byte instruction.
- Definition:
- it does nothing except move execution to the next instruction
- NOP sled idea:
- put a long sequence of `nop` bytes before the real malicious code
- now jumping anywhere in that region still works
- execution slides down into the payload
Why this helps:
- it increases the chance that an approximate address guess still succeeds
- the slides explicitly state:
- now we improve our chances of guessing by a factor of `#nops`
```text
[padding][saved return address guess][nop nop nop ...][malicious code]
```
#### Putting it all together
- Payload components shown in the slides:
- padding
- guessed return address
- NOP sled
- malicious code
- Constraint noted by the lecture:
- input has to start wherever the vulnerable `gets` / similar function begins writing
#### Buffer overflow defense #1: use secure bounds-checking functions
- User-level protection
- Replace unbounded routines with bounded ones.
- Prefer secure languages where possible:
- Java
- Rust
- etc.
#### Buffer overflow defense #2: Address Space Layout Randomization (ASLR)
- Randomize starting address of program regions.
- Goal:
- prevent attacker from guessing / finding the correct address to put in the return-address slot
- OS-level protection
#### Buffer overflow counter-technique: NOP sled
- Counter-technique against uncertain addresses
- By jumping somewhere into a wide sled, exact address knowledge becomes less necessary
#### Buffer overflow defense #3: Canary
- Put a guard value between vulnerable local data and control-flow data.
- If overflow changes the canary, the program can detect corruption before returning.
- OS-level / compiler-assisted protection in the lecture framing
#### Buffer overflow defense #4: No-execute bits (NX)
- Mark the stack as not executable.
- Requires hardware support.
- OS / hardware-level protection
#### Buffer overflow counter-technique: ret-to-libc and ROP
- Code in the C library is already stored at consistent addresses.
- Attacker can find code in the C library that has the desired effect.
- possibly heavily fragmented
- Then return to the necessary address or addresses in the proper order.
- This is the motivation behind:
- `ret-to-libc`
- Return-Oriented Programming (ROP)
We will continue from defenses / exploitation follow-ups in the next lecture.

View File

@@ -20,5 +20,7 @@ export default {
CSE4303_L13: "Introduction to Computer Security (Lecture 13)",
CSE4303_L14: "Introduction to Computer Security (Lecture 14)",
CSE4303_L15: "Introduction to Computer Security (Lecture 15)",
CSE4303_L16: "Introduction to Computer Security (Lecture 16)"
CSE4303_L16: "Introduction to Computer Security (Lecture 16)",
CSE4303_L17: "Introduction to Computer Security (Lecture 17)",
CSE4303_L18: "Introduction to Computer Security (Lecture 18)"
}

View File

@@ -5,8 +5,8 @@ I made this little book for my Honor Thesis, showing the relevant parts of my wo
Contents updated as displayed and based on my personal interest and progress with Prof.Feres.
<iframe src="https://git.trance-0.com/Trance-0/HonorThesis/raw/branch/main/main.pdf" width="100%" height="600px" style="border: none;" title="Embedded PDF Viewer">
<iframe src="https://git.trance-0.com/Trance-0/HonorThesis/raw/branch/main/latex/main.pdf" width="100%" height="600px" style="border: none;" title="Embedded PDF Viewer">
<!-- Fallback content for browsers that do not support iframes or PDFs within them -->
<iframe src="https://git.trance-0.com/Trance-0/HonorThesis/raw/branch/main/main.pdf" width="100%" height="500px">
<p>Your browser does not support iframes. You can <a href="https://git.trance-0.com/Trance-0/HonorThesis/raw/branch/main/main.pdf">download the PDF</a> file instead.</p>
<iframe src="https://git.trance-0.com/Trance-0/HonorThesis/raw/branch/main/latex/main.pdf" width="100%" height="500px">
<p>Your browser does not support iframes. You can <a href="https://git.trance-0.com/Trance-0/HonorThesis/raw/branch/main/latex/main.pdf">download the PDF</a> file instead.</p>
</iframe>

View File

@@ -0,0 +1,69 @@
# Math4202 Topology II (Lecture 27)
## Algebraic Topology
### Fundamental Groups for Higher Dimensional Sphere
#### Theorem for "gluing" fundamental group
Suppose $X=U\cup V$, where $U$ and $V$ are open subsets of $X$. Suppose that $U\cap V$ is path connected, and $x\in U\cap V$. Let $i,j$ be the inclusion maps of $U$ and $V$ into $X$, the images of the induced homomorphisms
$$
i_*:\pi_1(U,x_0)\to \pi_1(X,x_0)\quad j_*:\pi_1(V,x_0)\to \pi_1(X,x_0)
$$
The image of the two map generate $\pi_1(X,x_0)$.
$G$ is a group, and let $S\subseteq G$, where $G$ is generated by $S$, if $\forall g\in G$, $\exists s_1,s_2,\ldots,s_n\in S$ such that $g=s_1s_2\ldots s_n\in G$. (We can write $G$ as a word of elements in $S$.)
<details>
<summary>Proof</summary>
Let $f$ be a loop in $X$, $f\simeq g_1*g_2*\ldots*g_n$, where $g_i$ is a loop in $U$ or $V$.
For example, consider the function, $f=f_1*f_2*f_3*f_4$, where $f_1\in S_+$, $f_2\in S_-$, $f_3\in S_+$, $f_4\in S_-$.
Take the functions $\bar{\alpha_1}*\alpha_1\simeq e_{x_1}$ where $x_1$ is the intersecting point on $f_1$ and $f_2$.
Therefore,
$$
\begin{aligned}
f&=f_1*f_2*f_3*f_4\\
&(f_1*\bar{\alpha})*(\alpha_1*f_2*\bar{\alpha_2})*(\alpha_2*f_3*\bar{\alpha_3})*(\alpha_4*f_4)
\end{aligned}
$$
This decompose $f$ into a word of elements in either $S_+$ or $S_-$.
---
Note that $f$ is a continuous function $I\to X$, for $t\in I$, $\exists I_t$ being a small neighborhood of $t$ such that $f(I_t)\subseteq U$ or $f(I_t)\subseteq V$.
Since $U_{t\in I}I_t=I$, then $\{I_t\}_{t\in I}$ is an open cover of $I$.
By compactness of $I$, there is a finite subcover $\{I_{t_1},\ldots,I_{t_n}\}$.
Therefore, we can create a partition of $I$ into $[s_i,s_{i+1}]\subseteq I_{t_k}$ for some $k$.
Then with the definition of $I_{t_k}$, $f([s_i,s_{i+1}])\subseteq U$ or $V$.
Then we can connect $x_0$ to $f(s_i)$ with a path $\alpha_i\subseteq U\cap V$.
$$
\begin{aligned}
f&=f|_{[s_0,s_1]}*f|_{[s_1,s_2]}*\ldots**f|_{[s_{n-1},s_n]}\\
&\simeq f|_{[s_0,s_1]}*(\bar{\alpha_1}*\alpha_1)*f|_{[s_1,s_2]}*(\bar{\alpha_2}*\alpha_2)*\ldots*f|_{[s_{n-1},s_n]}*(\bar{\alpha_n}*\alpha_n
)\\
&=(f|_{[s_0,s_1]}*\bar{\alpha_1})*(\alpha_1*f|_{[s_1,s_2]}*\bar{\alpha_2})*\ldots*(\alpha_{n-1}*f|_{[s_{n-1},s_n]}*\bar{\alpha_n})\\
&=g_1*g_2*\ldots*g_n
\end{aligned}
$$
</details>
#### Corollary in higher dimensional sphere
Since $S^n_+$ and $S^n_-$ are homeomorphic to open balls $B^n$, then $\pi_1(S^n_+,x_0)=\pi_1(S^n_-,x_0)=\pi_1(B^n,x_0)=\{e\}$ for $n\geq 2$.
> Preview: Van Kampen Theorem

View File

@@ -0,0 +1,72 @@
# Math4202 Topology II (Lecture 28)
## Algebraic Topology
### Fundamental Groups of Some Surfaces
Recall from last week, we will see the fundamental group of $T^2=S^1\times S^1$, and $\mathbb{R}P^2$, Torus with genus $2$.
Some of them are abelian, and some are not.
#### Theorem for fundamental groups of product spaces
Let $X,Y$ be two manifolds. Then the fundamental group of $X\times Y$ is the direct product of their fundamental groups,
i.e.
$$
\pi_1(X\times Y,(x_0,y_0))=\pi_1(X,x_0)\times \pi_1(Y,y_0)
$$
<details>
<summary>Proof</summary>
We need to find group homomorphism: $\phi:\pi_1(X\times Y,(x_0,y_0))\to \pi_1(X,x_0)\times \pi_1(Y,y_0)$.
Let $P_x,P_y$ be the projection from $X\times Y$ to $X$ and $Y$ respectively.
$$
(P_x)_*:\pi_1(X\times Y,(x_0,y_0))\to \pi_1(X,x_0)
$$
$$
(P_y)_*:\pi_1(X\times Y,(x_0,y_0))\to \pi_1(Y,y_0)
$$
Given $\alpha\in \pi_1(X\times Y,(x_0,y_0))$, then $\phi(\alpha)=((P_x)_*\alpha,(P_y)_*\alpha)\in \pi_1(X,x_0)\times \pi_1(Y,y_0)$.
Since $(P_x)_*$ and $(P_y)_*$ are group homomorphism, so $\phi$ is a group homomorphism.
**Then we need to show that $\phi$ is bijective.** Then we have the isomorphism of fundamental groups.
To show $\phi$ is injective, then it is sufficient to show that $\ker(\phi)=\{e\}$.
Given $\alpha\in \ker(\phi)$, then $(P_x)_*\alpha=\{e_x\}$ and $(P_y)_*\alpha=\{e_y\}$, so we can find a path homotopy $P_X(\alpha)\simeq e_x$ and $P_Y(\alpha)\simeq e_y$.
So we can build $(H_x,H_y):X\times Y\times I\to X\times I$ by $(x,y,t)\mapsto (H_x(x,t),H_y(y,t))$ is a homotopy from $\alpha$ and $e_x\times e_y$.
So $[\alpha]=[(e_x\times e_y)]$. $\ker(\phi)=\{[(e_x\times e_y)]\}$.
Next, we show that $\phi$ is surjective.
Given $(\alpha,\beta)\in \pi_1(X,x_0)\times \pi_1(Y,y_0)$, then $(\alpha,\beta)$ is a loop in $X\times Y$ based at $(x_0,y_0)$. and $(P_x)_*([\alpha,\beta])=[\alpha]$ and $(P_y)_*([\alpha,\beta])=[\beta]$.
</details>
#### Corollary for fundamental groups of $T^2$
The fundamental group of $T^2=S^1\times S^1$ is $\mathbb{Z}\times \mathbb{Z}$.
#### Theorem for fundamental groups of $\mathbb{R}P^2$
$\mathbb{R}P^2$ is a compact 2-dimensional manifold with the universal covering space $S^2$ and a $2-1$ covering map $q:S^2\to \mathbb{R}P^2$.
#### Corollary for fundamental groups of $\mathbb{R}P^2$
$\pi_1(\mathbb{R}P^2)=\#q^{-1}(\{x_0\})=\{a,b\}=\mathbb{Z}/2\mathbb{Z}$
Using the path-lifting correspondence.
#### Lemma for The fundamental group of figure-8
The fundamental group of figure-8 is not abelian.

View File

@@ -0,0 +1,57 @@
# Math4202 Topology II (Lecture 29)
## Algebraic Topology
### Fundamental Groups of Some Surfaces
Recall from previous lecture, we talked about figure 8 shape.
#### Lemma The fundamental group of figure-8 is not abelian
The fundamental group of figure-8 is not abelian.
<details>
<summary>Proof</summary>
Consider $U,V$ be two "fish shape" where $U\cup V$ is the figure-8 shape, and $U\cap V$ is $x$ shape.
The $x$ shape is path connected,
$\pi_1(U,x_0)$ is isomorphic to $\pi_1(S^1,x_0)$, and $\pi_1(V,x_0)$ is isomorphic to $\pi_1(S^1,x_0)$.
To show that is not abelian, we need to show that $\alpha*\beta\neq \beta*\alpha$.
We will use covering map to do this.
[Universal covering of figure-8](https://notenexta.trance-0.com/Math4202/universal-covering-of-figure-8.png)
However, for proving our result, it is sufficient to use xy axis with loops on each integer lattice.
And $\tilde{\alpha*\beta}(1)=(1,0)$ and $\tilde{\beta*\alpha}(1)=(0,1)$. By path lifting correspondence, the two loops are not homotopic.
</details>
#### Theorem for fundamental groups of double torus (Torus with genus 2)
The fundamental group of Torus with genus 2 is not abelian.
<details>
<summary>Proof</summary>
If we cut the torus in the middle, we can have $U,V$ is two "punctured torus", which is homotopic to the figure-8 shape.
But the is trick is not enough to show that the fundamental group is not abelian.
---
First we use quotient map $q_1$ to map double torus to two torus connected at one point.
Then we use quotient map $q_2$ to map two torus connected at one point to figure-8 shape.
So $q=q_2\circ q_1$ is a quotient map from double torus to figure-8 shape.
Then consider the inclusion map $i$ and let the double torus be $X$, we claim that $i_*:\pi_1(\infty,x_0)\to \pi_1(X,x_0)$ is injective.
If $\pi_1(X,x_0)$ is abelian, then the figure 8 shape is abelian, that is contradiction.
</details>

View File

@@ -0,0 +1,91 @@
# Math4202 Topology II (Lecture 30)
## Algebraic Topology
We skipped a few chapters about Jordan curve theorem, which will be your final project soon. LOL, I will embedded the link once I'm done.
### Seifert-Van Kampen Theorem
#### The Seifert-Van Kampen Theorem
Let $X=U\cup V$ be a union of two open subspaces. Suppose that $U\cap V$, $U,V$ are path connected. Fix $x_0\in U\cap V$.
Let $H$ be a group (arbitrary). And now we assume $\phi_1,\phi_2$ be a group homomorphism, and $\phi_1:\pi_1(U,x_0)\to H$, and $\phi_2:\pi_1(V,x_0)\to H$.
![Seifert-Van Kampen Theorem](https://notenextra.trance-0.com/Math4202/Math4202_L30/Seifert-Van-Kampen-Theorem.png)
Let $i_1,i_2,j_1,j_2,i_{12}$ be group homomorphism induced by the inclusion maps.
Assume this diagram commutes.
$$
\phi_1\circ i_1=\phi_2\circ i_2
$$
There is a group homomorphism $\Phi:\pi_1(X,x_0)\to H$ making the diagram commute. $\Phi\circ j_1=\phi_1$ and $\Phi\circ j_2=\phi_2$.
We may change the base point using conjugations.
<details>
<summary>Side notes about free product of two groups</summary>
Consider arbitrary group $G_1,G_2$, then $G_1\times G_2$ is a group.
Note that the inclusion map $i_1:G_1\to G_1\times G_2$ is a group homomorphism and the inclusion map $i_2:G_2\to G_1\times G_2$ is a group homomorphism. The image of them commutes since $(e,g_2)(g_1,e)=(g_1,g_2)=(g_1,e)(e,g_2)$.
#### The universal property
Then we want to have a group $G$ such that for all group homomorphism $\phi:G_1\to H$ and $G_2\to H$, such that there always exists a map $\Phi: G\to H$ such that:
- $\Phi\circ i_1=\phi_1$
- $\Phi\circ i_2=\phi_2$
#### How to construct the free group?
We consider
$$
G_1*G_2=S=\{g_1h_1g_2h_2:g_1,g_2\in G_1,h_1,h_2\in G_2\}/\sim
$$
And we set $g_ie_{G_2}g_{i+1}\sim g_ig_{i+1}$ for $g_i\in G_1$ and $g_{i+1}\in G_2$.
And $h_je_{G_1}h_{j+1}\sim h_jh_{j+1}$ for $h_j\in G_2$ and $h_{j+1}\in G_1$.
And we define the group operation
$$
(g_1 h_1\cdots g_k h_k)*(h_1' g_1'\cdots h_l' g_l')=g_1 h_1\cdots g_k h_k g_1' h_2'\cdots h_l' g_l'
$$
And the inverse is defined
$$
(g_1 h_1\cdots g_k h_k)^{-1}=h_k^{-1} g_k^{-1}\cdots h_1^{-1} g_1^{-1}
$$
And $G=S$ is a well-defined group.
The homeomorphism $G\to H$ is defined as
$$
\Phi((g_1 h_1\cdots g_k h_k))=\phi_1(g_1)\circ \phi_2(h_1)\circ \cdots \circ \phi_1(g_k)\circ \phi_2(h_k)
$$
Note $\circ$ is the group operation in $H$.
> Group with such universal property is unique, so we don't need to worry for that too much.
</details>
Back to the Seifert-Van Kampen Theorem:
Let $H=\pi_1(U,x_0)* \pi_1(V,x_0)$.
Let $N$ be the **least normal subgroup** in the free product $H$, containing $i_1(g)i_2(g)^{-1}$, $\forall g\in \pi_1(U\cap V,x_0)$.
Note $i_1(g)\in \pi_1(U,x_0)$ and $i_2(g)\in \pi_1(V,x_0)$. You may think of them as $G_1,G_2$ in the free group descriptions.
#### Seifert-Van Kampen Theorem (classical version)
There is an isomorphism between $\pi_1(U,x_0)* \pi_1(V,x_0)/N$ and $\pi_1(U\cup V,x_0)$.

View File

@@ -31,4 +31,8 @@ export default {
Math4202_L23: "Topology II (Lecture 23)",
Math4202_L24: "Topology II (Lecture 24)",
Math4202_L25: "Topology II (Lecture 25)",
Math4202_L26: "Topology II (Lecture 26)",
Math4202_L27: "Topology II (Lecture 27)",
Math4202_L28: "Topology II (Lecture 28)",
Math4202_L29: "Topology II (Lecture 29)",
}

View File

@@ -0,0 +1,439 @@
# Math 4302 Exam 2 Review
## Groups
### Direct products
$\mathbb{Z}_m\times \mathbb{Z}_n$ is cyclic if and only if $m$ and $n$ have greatest common divisor $1$.
More generally, for $\mathbb{Z}_{n_1}\times \mathbb{Z}_{n_2}\times \cdots \times \mathbb{Z}_{n_k}$, if $n_1,n_2,\cdots,n_k$ are pairwise coprime, then the direct product is cyclic.
If $n=p_1^{m_1}\ldots p_k^{m_k}$, where $p_i$ are distinct primes, then the group
$$
G=\mathbb{Z}_n=\mathbb{Z}_{p_1^{m_1}}\times \mathbb{Z}_{p_2^{m_2}}\times \cdots \times \mathbb{Z}_{p_k^{m_k}}
$$
is cyclic.
### Structure of finitely generated abelian groups
#### Theorem for finitely generated abelian groups
Every finitely generated abelian group $G$ is isomorphic to
$$
Z_{p_1}^{n_1}\times Z_{p_2}^{n_2}\times \cdots \times Z_{p_k}^{n_k}\times\underbrace{\mathbb{Z}\times \ldots \times \mathbb{Z}}_{m\text{ times}}
$$
#### Corollary for divisor size of abelian subgroup
If $g$ is abelian and $|G|=n$, then for every divisor $m$ of $n$, $G$ has a subgroup of order $m$.
> [!WARNING]
>
> This is not true if $G$ is not abelian.
>
> Consider $A_4$ (alternating group for $S_4$) does not have a subgroup of order 6.
### Cosets
#### Definition of Cosets
Let $G$ be a group and $H$ its subgroup.
Define a relation on $G$ and $a\sim b$ if $a^{-1}b\in H$.
This is an equivalence relation.
- Reflexive: $a\sim a$: $a^{-1}a=e\in H$
- Symmetric: $a\sim b\Rightarrow b\sim a$: $a^{-1}b\in H$, $(a^{-1}b)^{-1}=b^{-1}a\in H$
- Transitive: $a\sim b$ and $b\sim c\Rightarrow a\sim c$ : $a^{-1}b\in H, b^{-1}c\in H$, therefore their product is also in $H$, $(a^{-1}b)(b^{-1}c)=a^{-1}c\in H$
So we get a partition of $G$ to equivalence classes.
Let $a\in G$, the equivalence class containing $a$
$$
aH=\{x\in G| a\sim x\}=\{x\in G| a^{-1}x\in H\}=\{x|x=ah\text{ for some }h\in H\}
$$
This is called the coset of $a$ in $H$.
#### Definition of Equivalence Class
Let $a\in H$, and the equivalence class containing $a$ is defined as:
$$
aH=\{x|a\simeq x\}=\{x|a^{-1}x\in H\}=\{x|x=ah\text{ for some }h\in H\}
$$
#### Properties of Equivalence Class
$aH=bH$ if and only if $a\sim b$.
#### Lemma for size of cosets
Any coset of $H$ has the same cardinality as $H$.
Define $\phi:H\to aH$ by $\phi(h)=ah$.
$\phi$ is an bijection, if $ah=ah'\implies h=h'$, it is onto by definition of $aH$.
#### Corollary: Lagrange's Theorem
If $G$ is a finite group, and $H\leq G$, then $|H|\big\vert |G|$. (size of $H$ divides size of $G$)
### Normal Subgroups
#### Definition of Normal Subgroup
A subgroup $H\leq G$ is called a normal subgroup if $aH=Ha$ for all $a\in G$. We denote it by $H\trianglelefteq G$
#### Lemma for equivalent definition of normal subgroup
The following are equivalent:
1. $H\trianglelefteq G$
2. $aHa^{-1}=H$ for all $a\in G$
3. $aHa^{-1}\subseteq H$ for all $a\in G$, that is $aha^{-1}\in H$ for all $a\in G$
### Factor group
Consider the operation on the set of left coset of $G$, denoted by $S$. Define
$$
(aH)(bH)=abH
$$
#### Condition for operation
The operation above is well defined if and only if $H\trianglelefteq G$.
#### Definition of factor (quotient) group
If $H\trianglelefteq G$, then the set of cosets with operation:
$$
(aH)(bH)=abH
$$
is a group denoted by $G/H$. This group is called the quotient group (or factor group) of $G$ by $H$.
#### Fundamental homomorphism theorem (first isomorphism theorem)
If $\phi:G\to G'$ is a homomorphism, then the function $f:G/\ker(\phi)\to \phi(G)$, ($\phi(G)\subseteq G'$) given by $f(a\ker(\phi))=\phi(a)$, $\forall a\in G$, is an well-defined isomorphism.
> - If $G$ is abelian, $N\leq G$, then $G/N$ is abelian.
> - If $G$ is finitely generated and $N\trianglelefteq G$, then $G/N$ is finitely generated.
#### Definition of simple group
$G$ is simple if $G$ has no proper ($H\neq G,\{e\}$), normal subgroup.
### Center of a group
Recall from previous lecture, the center of a group $G$ is the subgroup of $G$ that contains all elements that commute with all elements in $G$.
$$
Z(G)=\{a\in G\mid \forall g\in G, ag=ga\}
$$
this subgroup is normal and measure the "abelian" for a group.
#### Definition of the commutator of a group
Let $G$ be a group and $a,b\in G$, the commutator $[a,b]$ is defined as $aba^{-1}b^{-1}$.
$[a,b]=e$ if and only if $a$ and $b$ commute.
Some additional properties:
- $[a,b]^{-1}=[b,a]$
#### Definition of commutator subgroup
Let $G'$ be the subgroup of $G$ generated by all commutators of $G$.
$$
G'=\{[a_1,b_1][a_2,b_2]\ldots[a_n,b_n]\mid a_1,a_2,\ldots,a_n,b_1,b_2,\ldots,b_n\in G\}
$$
Then $G'$ is the subgroup of $G$.
- Identity: $[e,e]=e$
- Inverse: $([a_1,b_1],\ldots,[a_n,b_n])^{-1}=[b_n,a_n],\ldots,[b_1,a_1]$
Some additional properties:
- $G$ is abelian if and only if $G'=\{e\}$
- $G'\trianglelefteq G$
- $G/G'$ is abelian
- If $N$ is a normal subgroup of $G$, and $G/N$ is abelian, then $G'\leq N$.
### Group acting on a set
#### Definition for group acting on a set
Let $G$ be a group, $X$ be a set, $X$ is a $G$-set or $G$ acts on $X$ if there is a map
$$
G\times X\to X
$$
$$
(g,x)\mapsto g\cdot x\, (\text{ or simply }g(x))
$$
such that
1. $e\cdot x=x,\forall x\in X$
2. $g_2\cdot(g_1\cdot x)=(g_2 g_1)\cdot x$
#### Group action is a homomorphism
Let $X$ be a $G$-set, $g\in G$, then the function
$$
\sigma_g:X\to X,x\mapsto g\cdot x
$$
is a bijection, and the function $\phi:G\to S_X, g\mapsto \sigma_g$ is a group homomorphism.
#### Definition of orbits
We define the equivalence relation on $X$
$$
x\sim y\iff y=g\cdot x\text{ for some }g
$$
So we get a partition of $X$ into equivalence classes: orbits
$$
Gx\coloneqq \{g\cdot x|g\in G\}=\{y\in X|x\sim y\}
$$
is the orbit of $X$.
$x,y\in X$ either $Gx=Gy$ or $Gx\cap Gy=\emptyset$.
$X=\bigcup_{x\in X}Gx$.
#### Definition of isotropy subgroup
Let $X$ be a $G$-set, the stabilizer (or isotropy subgroup) corresponding to $x\in X$ is
$$
G_x=\{g\in G|g\cdot x=x\}
$$
$G_x$ is a subgroup of $G$. $G_x\leq G$.
- $e\cdot x=x$, so $e\in G_x$
- If $g_1,g_2\in G_x$, then $(g_1g_2)\cdot x=g_1\cdot(g_2\cdot x)=g_1 \cdot x$, so $g_1g_2\in G_x$
- If $g\in G_x$, then $g^{-1}\cdot g=x=g^{-1}\cdot x$, so $g^{-1}\in G_x$
#### Orbit-stabilizer theorem
If $X$ is a $G$-set and $x\in X$, then
$$
|Gx|=(G:G_x)=\text{ number of left cosets of }G_x=\frac{|G|}{|G_x|}
$$
#### Theorem for orbit with prime power groups
Suppose $X$ is a $G$-set, and $|G|=p^n$ for some prime $p$. Let $X_G$ be the set of all elements in $X$ whose orbit has size $1$. (Recall the orbit divides $X$ into disjoint partitions.) Then $|X|\equiv |X_G|\mod p$.
#### Corollary: Cauchy's theorem
If $p$ is prime and $p|(|G|)$, then $G$ has a subgroup of order $p$.
> This does not hold when $p$ is not prime.
>
> Consider $A_4$ with order $12$, and $A_4$ has no subgroup of order $6$.
#### Corollary: Center of prime power group is non-trivial
If $|G|=p^m$, then $Z(G)$ is non-trivial. ($Z(G)\neq \{e\}$)
#### Proposition: Prime square group is abelian
If $|G|=p^2$, where $p$ is a prime, then $G$ is abelian.
### Classification of small order
Let $G$ be a group
- $|G|=1$
- $G=\{e\}$
- $|G|=2$
- $G\simeq\mathbb{Z}_2$ (prime order)
- $|G|=3$
- $G\simeq\mathbb{Z}_3$ (prime order)
- $|G|=4$
- $G\simeq\mathbb{Z}_2\times \mathbb{Z}_2$
- $G\simeq\mathbb{Z}_4$
- $|G|=5$
- $G\simeq\mathbb{Z}_5$ (prime order)
- $|G|=6$
- $G\simeq S_3$
- $G\simeq\mathbb{Z}_3\times \mathbb{Z}_2\simeq \mathbb{Z}_6$
<details>
<summary>Proof</summary>
$|G|$ has an element of order $2$, namely $b$, and an element of order $3$, namely $a$.
So $e,a,a^2,b,ba,ba^2$ are distinct.
Therefore, there are only two possibilities for value of $ab$. ($a,a^2$ are inverse of each other, $b$ is inverse of itself.)
If $ab=ba$, then $G$ is abelian, then $G\simeq \mathbb{Z}_2\times \mathbb{Z}_3$.
If $ab=ba^2$, then $G\simeq S_3$.
</details>
- $|G|=7$
- $G\simeq\mathbb{Z}_7$ (prime order)
- $|G|=8$
- $G\simeq\mathbb{Z}_2\times \mathbb{Z}_2\times \mathbb{Z}_2$
- $G\simeq\mathbb{Z}_4\times \mathbb{Z}_2$
- $G\simeq\mathbb{Z}_8$
- $G\simeq D_4$
- $G\simeq$ quaternion group $\{e,i,j,k,-1,-i,-j,-k\}$ where $i^2=j^2=k^2=-1$, $(-1)^2=1$. $ij=l$, $jk=i$, $ki=j$, $ji=-k$, $kj=-i$, $ik=-j$.
- $|G|=9$
- $G\simeq\mathbb{Z}_3\times \mathbb{Z}_3$
- $G\simeq\mathbb{Z}_9$ (apply the corollary, $9=3^2$, these are all the possible cases)
- $|G|=10$
- $G\simeq\mathbb{Z}_5\times \mathbb{Z}_2\simeq \mathbb{Z}_{10}$
- $G\simeq D_5$
- $|G|=11$
- $G\simeq\mathbb{Z}_11$ (prime order)
- $|G|=12$
- $G\simeq\mathbb{Z}_3\times \mathbb{Z}_4$
- $G\simeq\mathbb{Z}_2\times \mathbb{Z}_2\times \mathbb{Z}_3$
- $A_4$
- $D_6\simeq S_3\times \mathbb{Z}_2$
- ??? One more
- $|G|=13$
- $G\simeq\mathbb{Z}_{13}$ (prime order)
- $|G|=14$
- $G\simeq\mathbb{Z}_2\times \mathbb{Z}_7$
- $G\simeq D_7$
#### Lemma for group of order $2p$ where $p$ is prime
If $p$ is prime, $p\neq 2$, and $|G|=2p$, then $G$ is either abelian $\simeq \mathbb{Z}_2\times \mathbb{Z}_p$ or $G\simeq D_p$
## Ring
### Definition of ring
A ring is a set $R$ with binary operation $+$ and $\cdot$ such that:
- $(R,+)$ is an abelian group.
- Multiplication is associative: $(a\cdot b)\cdot c=a\cdot (b\cdot c)$.
- Distribution property: $a\cdot (b+c)=a\cdot b+a\cdot c$, $(b+c)\cdot a=b\cdot a+c\cdot a$. (Note that $\cdot$ may not be abelian, may not even be a group, therefore we need to distribute on both sides.)
> [!NOTE]
>
> $a\cdot b=ab$ will be used for the rest of the sections.
#### Properties of rings
Let $0$ denote the identity of addition of $R$. $-a$ denote the additive inverse of $a$.
- $0\cdot a=a\cdot 0=0$
- $(-a)b=a(-b)=-(ab)$, $\forall a,b\in R$
- $(-a)(-b)=ab$, $\forall a,b\in R$
#### Definition of commutative ring
A ring $(R,+,\cdot)$ is commutative if $a\cdot b=b\cdot a$, $\forall a,b\in R$.
#### Definition of unity element
A ring $R$ has unity element if there is an element $1\in R$ such that $a\cdot 1=1\cdot a=a$, $\forall a\in R$.
#### Definition of unit
Suppose $R$ is a ring with unity element. An element $a\in R$ is called a unit if there is $b\in R$ such that $a\cdot b=b\cdot a=1$.
In this case $b$ is called the inverse of $a$.
#### Definition of division ring
If every $a\neq 0$ in $R$ has a multiplicative inverse (is a unit), then $R$ is called a division ring.
#### Definition of field
A commutative division ring is called a field.
#### Units in $\mathbb{Z}_n$ is coprime to $n$
More generally, $[m]\in \mathbb{Z}_n$ is a unit if and only if $\operatorname{gcd}(m,n)=1$.
### Integral Domains
#### Definition of zero divisors
If $a,b\in R$ with $a,b\neq 0$ and $ab=0$, then $a,b$ are called zero divisors.
#### Zero divisors in $\mathbb{Z}_n$
$[m]\in \mathbb{Z}_n$ is a zero divisor if and only if $\operatorname{gcd}(m,n)>1$ ($m$ is not a unit).
#### Corollaries of integral domain
If $R$ is a integral domain, then we have cancellation property $ab=ac,a\neq 0\implies b=c$.
#### Units with multiplication forms a group
If $R$ is a ring with unity, then the units in $R$ forms a group under multiplication.
### Fermats and Eulers Theorems
#### Fermats little theorem
If $p$ is not a divisor of $m$, then $m^{p-1}\equiv 1\mod p$.
#### Corollary of Fermats little theorem
If $m\in \mathbb{Z}$, then $m^p\equiv m\mod p$.
#### Eulers totient function
Consider $\mathbb{Z}_6$, by definition for the group of units, $\mathbb{Z}_6^*=\{1,5\}$.
$$
\phi(n)=|\mathbb{Z}_n^*|=|\{1\leq x\leq n:gcd(x,n)=1\}|
$$
#### Eulers Theorem
If $m\in \mathbb{Z}$, and $gcd(m,n)=1$, then $m^{\phi(n)}\equiv 1\mod n$.
#### Theorem for existence of solution of modular equations
$ax\equiv b\mod n$ has a solution if and only if $d=\operatorname{gcd}(a,n)|b$ And if there is a solution, then there are exactly $d$ solutions in $\mathbb{Z}_n$.
### Ring homomorphisms
#### Definition of ring homomorphism
Let $R,S$ be two rings, $f:R\to S$ is a ring homomorphism if $\forall a,b\in R$,
- $f(a+b)=f(a)+f(b)\implies f(0)=0, f(-a)=-f(a)$
- $f(ab)=f(a)f(b)$
#### Definition of ring isomorphism
If $f$ is a ring homomorphism and a bijection, then $f$ is called a ring isomorphism.

View File

@@ -2,7 +2,7 @@
## Rings
### Integral Domains
### Fermats and Eulers Theorems
Recall from last lecture, we consider $\mathbb{Z}_p$ and $\mathbb{Z}_p^*$ denote the group of units in $\mathbb{Z}_p$ with multiplication.
@@ -79,7 +79,7 @@ $\phi(8)=|\{1,3,5,7\}|=4$
If $[a]\in \mathbb{Z}_n^*$, then $[a]^{\phi(n)}=[1]$. So $a^{\phi(n)}\equiv 1\mod n$.
#### Theorem
#### Eulers Theorem
If $m\in \mathbb{Z}$, and $gcd(m,n)=1$, then $m^{\phi(n)}\equiv 1\mod n$.
@@ -104,7 +104,7 @@ Solution for $2x\equiv 1\mod 3$
So solution for $2x\equiv 1\mod 3$ is $\{3k+2|k\in \mathbb{Z}\}$.
#### Theorem for solving modular equations
#### Theorem for existence of solution of modular equations
$ax\equiv b\mod n$ has a solution if and only if $\operatorname{gcd}(a,n)|b$ and in that case the equation has $d$ solutions in $\mathbb{Z}_n$.

View File

@@ -0,0 +1,126 @@
# Math4302 Modern Algebra (Lecture 27)
## Rings
### Fermats and Eulers Theorems
Recall from last lecture, $ax\equiv b \mod n$, if $x\equiv y\mod n$, then $x$ is a solution if and only if $y$ is a solution.
#### Theorem for existence of solution of modular equations
$ax\equiv b\mod n$ has a solution if and only if $d=\operatorname{gcd}(a,n)|b$ And if there is a solution, then there are exactly $d$ solutions in $\mathbb{Z}_n$.
<details>
<summary>Proof</summary>
For the forward direction, we proved if $ax\equiv b\mod n$ then $ax-b=ny$, $y\in\mathbb{Z}$.
then $b=ax-ny$, $d|(ax-ny)$ implies that $d|b$.
---
For the backward direction, assume $d=\operatorname{gcd}(a,n)=1$. Then we need to show, there is exactly $1$ solution between $0$ and $n-1$.
If $ax\equiv b\mod n$, then in $\mathbb{Z}_n$, $[a][x]=[b]$. (where $[a]$ denotes the remainder of $a$ by $n$ and $[b]$ denotes the remainder of $b$ by $n$)
Since $\operatorname{gcd}(a,n)=1$, then $[a]$ is a unit in $\mathbb{Z}_n$, so we can multiply the above equation by the inverse of $[a]$. and get $[x]=[a]^{-1}[b]$.
Now assume $d=\operatorname{gcd}(a,n)$ where $n$ is arbitrary. Then $a=a'd$, then $n=n'd$, with $\operatorname{gcd}(a',n')=1$.
Also $d|b$ so $b=b'd$. So
$$
\begin{aligned}
ax\equiv b \mod n&\iff n|(ax-b)\\
&\iff n'd|(a'dx-b'd)\\
&\iff n'|(a'x-b')\\
&\iff a'x\equiv b'\mod n'
\end{aligned}
$$.
Since $\operatorname{gcd}(a',n')=1$, there is a unique solution $x_0\in \mathbb{Z}_{n'}$. $0\leq x_0\leq n'+1$. Other solution in $\mathbb{Z}$ are of the form $x_0+kn'$ for $k\in \mathbb{Z}$.
And there will be $d$ solutions in $\mathbb{Z}_n$,
</details>
<details>
<summary>Examples</summary>
Solve $12x\equiv 25\mod 7$.
$12\equiv 5\mod 7$, $25\equiv 4\mod 7$. So the equation becomes $5x\equiv 4\mod 7$.
$[5]^{-1}=3\in \mathbb{Z}_7$, so $[5][x]\equiv [4]$ implies $[x]\equiv [3][4]\equiv [5]\mod 7$.
So solution in $\mathbb{Z}$ is $\{5+7k:k\in \mathbb{Z}\}$.
---
Solve $6x\equiv 32\mod 20$.
$\operatorname{gcd}(6,20)=2$, so $6x\equiv 12\mod 20$ if and only if $3x\equiv 6\mod 10$.
$[3]^{-1}=[7]\in \mathbb{Z}_{10}$, so $[3][x]\equiv [6]$ implies $[x]\equiv [7][6]\equiv [2]\mod 10$.
So solution in $\mathbb{Z}_{20}$ is $[2]$ and $[12]$
So solution in $\mathbb{Z}$ is $\{2+10k:k\in \mathbb{Z}\}$
</details>
### Ring homomorphisms
#### Definition of ring homomorphism
Let $R,S$ be two rings, $f:R\to S$ is a ring homomorphism if $\forall a,b\in R$,
- $f(a+b)=f(a)+f(b)\implies f(0)=0, f(-a)=-f(a)$
- $f(ab)=f(a)f(b)$
#### Definition of ring isomorphism
If $f$ is a ring homomorphism and a bijection, then $f$ is called a ring isomorphism.
<details>
<summary>Example</summary>
Let $f:(\mathbb{Z},+,\times)\to(2\mathbb{Z},+,\times)$ by $f(a)=2a$.
Is not a ring homomorphism since $f(ab)\neq f(a)f(b)$ in general.
---
Let $f:(\mathbb{Z},+,\times)\to(\mathbb{Z}_n,+,\times)$ by $f(a)=a\mod n$
Is a ring homomorphism.
</details>
### Integral domains and their file fo fractions.
Let $R$ be an integral domain: (i.e. $R$ is commutative with unity and no zero divisors).
#### Definition of field of fractions
If $R$ is an integral domain, we can construct a field containing $R$ called the field of fractions (or called field of quotients) of $R$.
$$
S=\{(a,b)|a,b\in R, b\neq 0\}
$$
a relation on $S$ is defined as follows:
$(a,b)\sim (c,d)$ if and only if $ad=bc$.
<details>
<summary>This equivalence relation is well defined</summary>
- Reflectivity: $(a,b)\sim (a,b)$ $ab=ab$
- Symmetry: $(a,b)\sim (c,d)\Rightarrow (c,d)\sim (a,b)$
- Transitivity: $(a,b)\sim (c,d)$ and $(c,d)\sim (e,f)\Rightarrow (a,b)\sim (e,f)$
- $ad=bc$, and $cf=ed$, we want to conclude that $af=be$. since $ad=bc$, then $adf=bcf$, since $cf=ed$, then $cfb=edb$, therefore $adf=edb$.
- Then $d(af-be)=0$ since $d\neq 0$ then $af=be$.
</details>
Then $S/\sim$ is a field.

View File

@@ -0,0 +1,153 @@
# Math4302 Modern Algebra (Lecture 28)
## Rings
### Field of quotients
Let $R$ be an integral domain ($R$ has unity and commutative with no zero divisors).
Consider the pair $S=\{(a,b)|a,b\in R, b\neq 0\}$.
And define the equivalence relation on $S$ as follows:
$(a,b)\sim (c,d)$ if and only if $ad=bc$.
We denote $[(a,b)]$ as set of all elements in $S$ equivalent to $(a,b)$.
Let $F$ be the set of all equivalent classes. We define addition and multiplication on $F$ as follows:
$$
[(a,b)]+[(c,d)]=[(ad+bc,bd)]
$$
$$
[(a,b)]\cdot[(c,d)]=[(ac,bd)]
$$
<details>
<summary>The multiplication and addition is well defined </summary>
Addition:
If $(a,b)\sim (a',b')$, and $(c,d)\sim (c',d')$, then we want to show that $(ad+bc,bd)\sim (a'd+c'd,b'd)$.
Since $(a,b)\sim (a',b')$, then $ab'=a'b$; $(c,d)\sim (c',d')$, then $cd'=dc'$,
So $ab'dd'=a'bdd'$, and $cd'bb'=dc'bb'$.
$adb'd'+bcb'd'=a'd'bd+b'c'bd$, therefore $(ad+bc,bd)\sim (a'd+c'd,b'd)$.
---
Multiplication:
If $(a,b)\sim (a',b')$, and $(c,d)\sim (c',d')$, then we want to show that $(ac,bd)\sim (a'c',b'd')$.
Since $(a,b)\sim (a',b')$, then $ab'=a'b$; $(c,d)\sim (c',d')$, then $cd'=dc'$, so $(ac,bd)\sim (a'c',b'd')$
</details>
#### Claim (F,+,*) is a field
- additive identity: $(0,1)\in F$
- additive inverse: $(a,b)\in F$, then $(-a,b)\in F$ and $(-a,b)+(a,b)=(0,1)\in F$
- additive associativity: bit long.
- multiplicative identity: $(1,1)\in F$
- multiplicative inverse: $[(a,b)]$ is non zero if and only if $a\neq 0$, then $a^{-1}=[(b,a)]\in F$.
- multiplicative associativity: bit long
- distributivity: skip, too long.
Such field is called a quotient field of $R$.
And $F$ contains $R$ by $\phi:R\to F$, $\phi(a)=[(a,1)]$.
This is a ring homomorphism.
- $\phi(a+b)=[(a+b,1)]=[(a,1)][(b,1)]\phi(a)+\phi(b)$
- $\phi(ab)=[(ab,1)]=[(a,1)][(b,1)]\phi(a)\phi(b)$
and $\phi$ is injective.
If $\phi(a)=\phi(b)$, then $a=b$.
<details>
<summary>Example</summary>
Let $D\subset \mathbb R$ and
$$
\mathbb Z \subset D\coloneqq \{a+b\sqrt{2}:a,b\in \mathbb Z\}
$$
Then $D$ is a subring of $\mathbb R$, and integral domain, with usual addition and multiplication.
$$
(a+b\sqrt{2})(c+d\sqrt{2})=(ac+2bd)+(ad+bc)\sqrt{2}
$$
$$
-(a+b\sqrt{2})=(-a)+(-b)\sqrt{2})
$$
...
$D$ is a integral domain since $\mathbb R$ has no zero divisors, therefore $D$ has no zero divisors.
Consider the field of quotients of $D$. $[(a+b\sqrt{2},c+d\sqrt{2})]$. This is isomorphic to $\mathbb Q(\sqrt2)=\{r+s\sqrt{2}:r,s\in \mathbb Q\}$
$$
m+n\sqrt{2}=\frac{m}{n}+\frac{m'}{n'}\sqrt{2}\mapsto [(mn'+nm'\sqrt{2},nn')]
$$
And use rationalization on the forward direction.
</details>
#### Polynomial rings
Let $R$ be a ring, a polynomial with coefficients in $R$ is a sum
$$
a_0+a_1x+\cdots+a_nx^n
$$
where $a_i\in R$. $x$ is indeterminate, $a_0,a_1,\cdots,a_n$ are called coefficients. $a_0$ is the constant term.
If $f$ is a non-zero polynomial, then the degree of $f$ is defined as the largest $n$ such that $a_n\neq 0$.
<details>
<summary>Example</summary>
Let $f=1+2x+0x^2-1x^3+0x^4$, then $deg f=3$
</details>
If $R$ has a unity $1$, then we write $x^m$ instead of $1x^m$.
Let $R[x]$ denote the set of all polynomials with coefficients in $R$.
We define multiplication and addition on $R[x]$.
$f:a_0+a_1x+\cdots+a_nx^n$
$g:b_0+b_1x+\cdots+b_mx^m$
Define,
$$
f+g=a_0+b_0+a_1x+b_1x+\cdots+a_nx^n+b_mx^m
$$
$$
fg=(a_0b_0)+(a_1b_0)x+\cdots+(a_nb_m)x^m
$$
In general, the coefficient of $x^m=\sum_{i=0}^{m}a_ix^{m-i}$.
> [!CAUTION]
>
> The field $R$ may not be commutative, follow the order of computation matters.
We will show that this is a ring and explore additional properties.

View File

@@ -0,0 +1,145 @@
# Math4302 Modern Algebra (Lecture 29)
## Rings
### Polynomial Rings
$$
R[x]=\{a_0+a_1x+\cdots+a_nx^n:a_0,a_1,\cdots,a_n\in R,n>1\}
$$
Then $(R[x],+,\cdot )$ is a ring.
If $R$ has a unity $1$, then $R[x]$ has a unity $1$.
If $R$ is commutative, then $(R[x],+,\cdot )$ is commutative.
#### Definition of evaluation map
Let $F$ be a field, and $F[x]$. Fix $\alpha\in F$. $\phi_\alpha:F[x]\to F$ defined by $f(x)\mapsto f(\alpha)$ (the evaluation map).
Then $\phi_\alpha$ is a ring homomorphism. $\forall f,g\in F[x]$,
- $(f+g)(\alpha)=f(\alpha)+g(\alpha)$
- $(fg)(\alpha)=f(\alpha)g(\alpha)$ (use commutativity of $\cdot$ of $F$, $f(\alpha)g(\alpha)=\sum_{k=0}^{n+m}c_k x^k$, where $c_k=\sum_{i=0}^k a_ib_{k-i}$)
#### Definition of roots
Let $\alpha\in F$ is zero (or root) of $f\in F[x]$, if $f(\alpha)=0$.
<details>
<summary>Example</summary>
$f(x)=x^3-x, F=\mathbb{Z}_3$
$f(0)=f(1)=0$, $f(2)=8-2=2-2=0$
but note that $f(x)$ is not zero polynomial $f(x)=0$, but all the evaluations are zero.
</details>
#### Factorization of polynomials
Division algorithm. Let $F$ be a field, $f(x),g(x)\in F[x]$ with $g(x)$ non-zero. Then there are unique polynomials $q(x),r(x)\in F[x]$ such that
$f(x)=q(x)g(x)+r(x)$
where $f(x)=a_0+a_1x+\cdots+a_nx^n$ and $g(x)=b_0+b_1x+\cdots+b_mx^m$, $r(x)=c_0+c_1x+\cdots+c_tx^t$, and $a^n,b^m,c^t\neq 0$.
$r(x)$ is the zero polynomial or $\deg r(x)<\deg g(x)$.
<details>
<summary>Proof</summary>
Uniqueness: exercise
---
Existence:
Let $S=\{f(x)-h(x)g(x):h(x)\in F[x]\}$.
If $0\in S$, then we are done. Suppose $0\notin S$.
Let $r(x)$ be the polynomial with smallest degree in $S$.
$f(x)-h(x)g(x)=r(x)$ implies that $f(x)=h(x)g(x)+r(x)$.
If $\deg r(x)<\deg g(x)$, then we are done; we set $q(x)=h(x)$.
If $\deg r(x)\geq\deg g(x)$, we get a contradiction, let $t=\deg r(x)$.
$m=\deg g(x)$. (so $m\leq t$) Look at $f(x)-(h(x)+\frac{c_t}{b_m}x^{t-m})g(x)$.
then $f(x)-(h(x)+\frac{c_t}{b_m}x^{t-m})g(x)=f(x)-h(x)g(x)-\frac{c_t}{b_m}x^{t-m}g(x)$.
And $f(x)-h(x)g(x)=r(x)=c_0+c_1x+\cdots+c_tx^t$, $c_t\neq 0$.
$\frac{c_t}{b_m}x^{t-m}g(x)=\frac{c_0c_t}{b_m}x^{t-m}+\cdots+c_t x^t$
That the largest terms cancel, so this gives a polynomial of degree $<t$, which violates that $r(x)$ has smallest degree.
</details>
<details>
<summary>Example</summary>
$F=\mathbb{Z}_5=\{0,1,2,3,4\}$
Divide $3x^4+2x^3+x+2$ by $x^2+4$ in $\mathbb{Z}_5[x]$.
$$
3x^4+2x^3+x+2=(3x^3+2x-2)(x^2+4)+3x
$$
So $q(x)=3x^3+2x-2$, $r(x)=3x$.
</details>
#### Some corollaries
$a\in F$ is a zero of $f(x)$ if and only if $(x-a)|f(x)$.
That is, the remainder of $f(x)$ when divided by $(x-a)$ is zero.
<details>
<summary>Proof</summary>
If $(x-a)|f(x)$, then $f(a)=0$.
If $f(x)=(x-a)q(x)$, then $f(a)=(a-a)q(a)=0$.
---
If $a$ is a zero of $f(x)$, then $f(x)$ is divisible by $(x-a)$.
We divide $f(x)$ by $(x-a)$.
$f(x)=q(x)(x-a)+r(x)$, where $r(x)$ is a constant polynomial (by degree of division).
Evaluate at $f(a)=0=0+r$, therefore $r=0$.
</details>
#### Another corollary
If $f(x)\in F[x]$ and $\deg f(x)=0$, then $f(x)$ has at most $n$ zeros.
<details>
<summary>Proof</summary>
We proceed by induction on $n$, if $n=1$, this is clear. $ax+b$ have only root $x=-\frac{b}{a}$.
Suppose $n\geq 2$.
If $f(x)$ has no zero, done.
If $f(x)$ has at least $1$ zero, then $f(x)=(x-a)q(x)$ (by our first corollary), where degree of $q(x)$ is $n-1$.
So zeros of $f(x)=\{a\}\cup$ zeros of $q(x)$, and such set has at most $n$ elements.
Done.
</details>
Preview: How to know if a polynomial is irreducible? (On Friday)

View File

@@ -1,5 +1,6 @@
export default {
index: "Course Description",
Exam_reviews: "Exam reviews",
"---":{
type: 'separator'
},
@@ -29,4 +30,7 @@ export default {
Math4302_L24: "Modern Algebra (Lecture 24)",
Math4302_L25: "Modern Algebra (Lecture 25)",
Math4302_L26: "Modern Algebra (Lecture 26)",
Math4302_L27: "Modern Algebra (Lecture 27)",
Math4302_L28: "Modern Algebra (Lecture 28)",
Math4302_L29: "Modern Algebra (Lecture 29)",
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB